c++ unsigned char 内存拷贝

Posted

技术标签:

【中文标题】c++ unsigned char 内存拷贝【英文标题】:c++ unsigned char memory copy 【发布时间】:2012-10-05 07:38:22 【问题描述】:

我需要将一个无符号字符数组从一种方法传递给另一种方法,我尝试使用以下代码:


     unsigned char *lpBuffer = new unsigned char[182];
 ReceiveSystemState(lpBuffer);



BOOL ReceiveSystemState(unsigned char *lpBuffer)
  
      unsigned char strRecvBuffer[182] =  0 ;
      //strRecvBuffer construction

      memcpy(lpBuffer, strRecvBuffer, sizeof(strRecvBuffer));

      return TRUE;
 

这 3 种方法(在 ReceiveSystemState 中使用)都没有按我的预期工作。在使用它们中的每一个之后,它被复制的是来自strRecvBuffer 的第一个字符,仅此而已。 strRecvBuffer 从元素到元素都有空字符,但我需要它们,因为该字符串是来自硬件设备的消息,并且该消息将使用协议进行分析。我在这里想念什么?我初始化lpBuffer错了吗?

编辑:我使用了一个简单的memcpy 方法来完成这项工作。结果还是一样:复制的只是strRecvBuffer的第一个字符。

EDIT2:工作代码:


     unsigned char *lpBuffer = new unsigned char[182];
     ReceiveSystemState(lpBuffer);
     for (int i = 0; i < 144; i++)
     
         memcpy(&c_dateKG[i], lpBuffer + i * sizeof(unsigned char), sizeof(unsigned char) );
     

    
  BOOL ReceiveSystemState(unsigned char *lpBuffer)
  
     unsigned char strRecvBuffer[182] =  0 ;
     //strRecvBuffer construction

     memcpy(lpBuffer, strRecvBuffer, sizeof(strRecvBuffer));

     return TRUE;
  

【问题讨论】:

@Nobody...我认为这不会有什么不同,因为unsigned char 有 1 个字节大小。所以基本上182 * sizeof(unsigned char)182 相同。 我不明白。这些数据应该从哪里来?您将 strRecvBuffer 定义为包含一个 0 和之后的垃圾。除此之外,memcpy 将复制所有数组,您的循环也将复制。 = 0 是将所有元素设置为 0 的语法 memcpy( lpBuffer, strRecvBuffer, 182 ) 应该可以完成这项工作。还有一些你没有向我们展示的东西。另外:为什么你有时会投给void,而不是其他人?为什么要将NULL 分配给立即超出范围的变量,为什么要在delete[] 之前检查null(空指针是合法的),而不是更早?就此而言,您为什么要检查 null,因为 new[] 保证永远不会返回空指针?也许最重要的是:你为什么使用new[],而不是std::vector&lt; unsigned char &gt; @MRM 关于“从串行端口读取数据并返回 strRecvBuffer 的方法”。在上面的代码中 strRecvBuffer 是一个局部变量,因此我们假设您将它传递给 看不见的方法?上面的代码不是您的源代码导致您的问题。我毫不怀疑您有问题,但是在将您认为不重要的代码发布到此处之前,在修剪您认为不重要的代码的过程中,您也解决了问题。对此有任何疑问,我建议您仅使用上面的代码创建一个独立文件并运行 that。假设 dyn-alloc 和 static 都是 182 字节。工作。 【参考方案1】:

您的代码绝对是垃圾。一些注意事项:

使用sizeof

使用sizeof(static_massive_name);count_of_arr_elements * sizeof(arr_type);

例如:

unsigned char src[255];    
unsigned char dst[255];

// fill src with random data
for (int i = 0; i < 255; ++i) 
    src[i] = static_cast<unsigned char> (rand() % 255);


memcpy(dst, src, sizeof(dst));


// now dst will have copied values from src (random numbers)

更新

用于测试的完整源代码:

#include <iostream>
#include <string.h>
#include <time.h>
#include <stdlib.h>

using namespace std;

void print(unsigned char* arr, size_t size) 
    for (size_t i = 0; i < size; ++i)  
        // see type casting (to int)!!!
        cout << "arr[" << i << "] = " << (int)arr[i]<< endl;
    


int main() 
    srand(time(0));

    // unsigned char type hold values from 0 to 255
    unsigned char src[15];
    unsigned char dst[15];

    for (int i = 0; i < 15; ++i) 
        src[i] = rand() % 255;
    

    memcpy(dst, src, sizeof(dst));

    print(src, 15);
    print(dst, 15);

    return 0;

结果:

arr[0] = 34
arr[1] = 80
arr[2] = 183
arr[3] = 112
arr[4] = 18
arr[5] = 120
arr[6] = 183
arr[7] = 0
arr[8] = 0
arr[9] = 0
arr[10] = 0
arr[11] = 57
arr[12] = 137
arr[13] = 4
arr[14] = 8
arr[0] = 34
arr[1] = 80
arr[2] = 183
arr[3] = 112
arr[4] = 18
arr[5] = 120
arr[6] = 183
arr[7] = 0
arr[8] = 0
arr[9] = 0
arr[10] = 0
arr[11] = 57
arr[12] = 137
arr[13] = 4
arr[14] = 8

【讨论】:

我也试过了,结果是一样的:只复制了第一个字符。 您的示例工作正常,将方法应用于我的代码不起作用。 1.如果我的代码运行良好,则系统 memcpy 运行良好 2. 当您打印 unsigned char 时 - 确保强制转换为 int(如果您的代码使用 c++)或 printf(对于 C 代码): unsigned char var = 12; printf("var is = %d\n", (int) var); 我确信 memcpy 工作正常,但在我的代码中仍然存在一些我不正确使用的东西。这真的没有意义,因为我现在的语法看起来很好。 示例代码错误! memcpy 函数中的“src”和“dst”需要交换,正确:memcpy(dst, src, sizeof(src));检查manual。给出的示例代码似乎有效,因为未初始化的“dst”还包含随机字符。为了更好的测试,在 src 初始化循环中使用 i 而不是 rand() % 255。

以上是关于c++ unsigned char 内存拷贝的主要内容,如果未能解决你的问题,请参考以下文章

将 unsigned char * 数组可视化为位图 [关闭]

带有 unsigned char * 的内存泄漏

如何把c++中的unsigned char* mData的数据指针通过jni把数据传给java使用?

小知识点记录

小知识点记录

C++读懂指针与内存