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< unsigned char >
?
@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 * 数组可视化为位图 [关闭]