将结构复制到char[]缓冲区
Copy struct to char[] buffer
我必须将以下结构复制到char[]缓冲区。
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));
在复制时,缓冲区具有前两个无符号字符数据和short(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( "%sn", sendbuf )
的事情。好吧,这不起作用,因为缓冲区实际上并不包含字符,而是包含二进制数据。
具体来说,您的short usErrorFlag
有两个字节长,由于您存储在其中的值是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可能正好相反,这就是为什么你会找到该数据结构的规范)。
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- char* 缓冲区 = C++ 中的新 vs char 缓冲区 []
- char p[0]表示自动分配的缓冲区还是安全指针
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- 将 char* 推送到矢量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到矢量中
- 缓冲区用不需要的数据填充 char 数组中的最后一个空格
- 当需要将char缓冲区转换为字符串时
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 将int转换为十六进制并将其存储到char缓冲区中
- 从 char* 缓冲区读取int32_t的惯用 cpp14 方法是什么?
- 如何在C#struct中声明和使用固定尺寸的char缓冲区
- 从 char 缓冲区读取 32 位变量
- RapidXML-解析char *上的缓冲区溢出
- 通过HTTP获得C ,忽略Char缓冲区中的逃生字符
- 生成*char缓冲区
- fopen在响应不相关的char缓冲区时崩溃
- 将以null结尾的char数组复制到符合缓冲区长度的std::字符串中
- 使用 libzpaq 压缩 c++ 压缩到 char* 缓冲区
- 在一系列char*缓冲区中查找序列号
- 无法将整数写入缓冲区(char*)内的偏移量