C++ 将结构复制到char[]缓冲区
我必须将以下结构复制到char[]缓冲区C++ 将结构复制到char[]缓冲区,c++,structure,memcpy,C++,Structure,Memcpy,我必须将以下结构复制到char[]缓冲区 struct AMG_ANGLES { unsigned char bIsEnCrypted; unsigned char bIsError; unsigned short usErrorFlag; unsigned char byteNumDABs; unsigned short usBagId;
struct AMG_ANGLES {
unsigned char bIsEnCrypted;
unsigned char bIsError;
unsigned short usErrorFlag;
unsigned char byteNumDABs;
unsigned short usBagId;
unsigned short usKvMa;
unsigned char byteDataType;
};
AMG_ANGLES struct_data;
struct_data.bIsEnCrypted = 1;
struct_data.bIsError = 1;
struct_data.usErrorFlag = 2;
struct_data.byteNumDABs = 1;
struct_data.usBagId =10;
struct_data.usKvMa=20;
struct_data.byteDataType = 1;
// here I am coping structure to a char buffer
char sendbuf[sizeof(struct_data)] = "";
memcpy(sendbuf,(char*)&struct_data, sizeof(struct_data));
复制时,缓冲区具有前两个无符号字符数据和短(1,1,2),大小仅为3字节。铰孔数据未被复制。
请帮助我哪里做错了
我也试着这样做
memcpy(sendbuf+0, &struct_data.bIsEnCrypted, sizeof(struct_data.bIsEnCrypted));
memcpy(sendbuf+1, &struct_data.bIsError, sizeof(struct_data.bIsError));
memcpy(sendbuf+2, &struct_data.usErrorFlag, sizeof(struct_data.usErrorFlag));
memcpy(sendbuf+4, &struct_data.byteNumDABs, sizeof(struct_data.byteNumDABs));
memcpy(sendbuf+6, &struct_data.usBagId, sizeof(struct_data.usBagId));
memcpy(sendbuf+8, &struct_data.usKvMa, sizeof(struct_data.usKvMa));
memcpy(sendbuf+10, &struct_data.byteDataType, sizeof(struct_data.byteDataType));
我得到了相同的结果。您的代码很好;您确定缓冲区内容是否正确的方法存在缺陷 您没有告诉我们您是如何确定缓冲区的内容是错误的,但根据您的描述,我怀疑您做了类似于
printf(“%s\n”,sendbuf)
的事情。这是行不通的,因为缓冲区实际上不包含字符,它包含二进制数据
具体地说,您的short userrorfag
有两个字节长,由于存储在其中的值是2
,这意味着它将以两个连续字节的形式存储在sendbuf
中,一个字节的值为0x02
,下一个字节的值为0x00
。(根据您描述中的提示,假设您的硬件是“Little Endian”。)因此,当您尝试将sendbuf
的内容作为字符串查看时,printf()
将在遇到0x00
字节时立即停止打印
因此,您的代码是正确的。继续将您的
sendbuf
发送到UDP套接字。您的代码正常;您确定缓冲区内容是否正确的方法存在缺陷
您没有告诉我们您是如何确定缓冲区的内容是错误的,但根据您的描述,我怀疑您做了类似于printf(“%s\n”,sendbuf)
的事情。这是行不通的,因为缓冲区实际上不包含字符,它包含二进制数据
具体地说,您的short userrorfag
有两个字节长,由于存储在其中的值是2
,这意味着它将以两个连续字节的形式存储在sendbuf
中,一个字节的值为0x02
,下一个字节的值为0x00
。(根据您描述中的提示,假设您的硬件是“Little Endian”。)因此,当您尝试将sendbuf
的内容作为字符串查看时,printf()
将在遇到0x00
字节时立即停止打印
因此,您的代码是正确的。继续将您的sendbuf
发送到UDP套接字。如果我读到“sendbuf”,我会立即认为您正在从一台计算机向另一台计算机发送数据。这些计算机将有不同的编译器,例如,编译器将以不同的顺序排列字节。memcpy不会在所有编译器上工作
我建议您找到sendbuf的内容记录在哪里,并相应地分配各个字节。比如说
sendbuf [0] = struct_data.bIsEncrypted;
sendbuf [1] = struct_data.bIsError;
sendbuf [2] = struct_data.uIsErrorFlag >> 8;
sendbuf [3] = struct_data.uIsErrorFlag & 0xff;
这使您的代码独立于字节排序、结构填充、不使用POD后的项目重新排序,等等。在你的情况下,我敢打赌,在byteNumDABs和usBagId之间,以及在最后,至少有填充物
(字节2和3可能正好相反,这就是为什么您会找到该数据结构的规范)。如果我读到“sendbuf”,我会立即假设您正在从一台计算机向另一台计算机发送数据。这些计算机将有不同的编译器,例如,编译器将以不同的顺序排列字节。memcpy不会在所有编译器上工作
我建议您找到sendbuf的内容记录在哪里,并相应地分配各个字节。比如说
sendbuf [0] = struct_data.bIsEncrypted;
sendbuf [1] = struct_data.bIsError;
sendbuf [2] = struct_data.uIsErrorFlag >> 8;
sendbuf [3] = struct_data.uIsErrorFlag & 0xff;
这使您的代码独立于字节排序、结构填充、不使用POD后的项目重新排序,等等。在你的情况下,我敢打赌,在byteNumDABs和usBagId之间,以及在最后,至少有填充物
(字节2和3可能正好相反,这就是为什么您会找到该数据结构的规范).如果将相同类型的成员放在一起,则结构在内存中可能会更紧凑。还要注意,不同的编译器和不同设置上的同一编译器可能会以不同方式填充结构。memcpy之后,我将打印sendbuf int n=strlen(sendbuf)的strlen;我得到的n值仅为3,并且该值正在发送到服务器应用程序。如果将相同类型的成员放在一起,则结构在内存中可能会更紧凑。还请注意,不同的编译器和不同设置上的相同编译器可能会以不同方式填充结构。memcpy之后,我将打印sendbuf的strlenint n=strlen(sendbuf);我得到的n值仅为3,同样发送到服务器应用程序。