我有两个对象,Header和DF。比方说
header = CCCCCC7E
和
DF = 01020304
,
缓冲区的值不应该是CCCCCC7E01020304
吗?
出于某种原因,当我打印它时,我得到了:
7EFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCCFFFFFFCC00FFFF
FFCC00000000000004030201FFFFFF8967341200000000
我就是这样打印的:
for (int i = 0; i < sizeof(buffer); i++)
{ printf("%02X", buffer[i]); }
这是代码:
struct Header header;
struct Data_Format DF;
unsigned char buffer[TOTAL_SIZE];
header.Start = 0x7E;
header.Options = 0x00;
header.PacketLength = 0x00;
header.VCP = 0x00;
header.Reserved = 0x00;
header.Return = 0x00;
DF.Address = 0x01020304; //real value: NULL
DF.Result = 0x1234; //real value: NULL
DF.Size = 0x6789; //real value: NULL
memcpy(buffer,&header, sizeof(Header));
memcpy(buffer+sizeof(Header), &DF, sizeof(Data_Format));
从给出的部分代码来看,它没有给出太多想法,但需要做一些事情。
总是在应对缓冲区之前执行memset。
memset(buffer, 0, sizeof(buffer))
这将防止你得到垃圾。
对象不一定要打包在一起。事实上,大多数编译器都在8字节的边界处对对象进行签名,以便以更高的速度访问数据。对象之间的字节将保持未初始化状态(有时运行时环境的调试版本会用无效数据填补空白)。
这不是实现您想要的目标的正确方法[因为编译器优化和对齐]。
然而,只是为了一个合乎逻辑的建议,在您的代码中,更改
for (int i = 0; i < sizeof(buffer); i++)
至
for (int i = 0; i < (sizeof(Header) + sizeof(Data_Format)); i++)
。
这将限制循环直到有效条目。记住,即使在这个改变之后,你也不能保证[实际上,不应该]得到正确的结果。
编辑
您可以使用CCD_ 7来实现您的目标。一个常见的用法看起来像
snprintf(buf, sizeof(buf), "%x%x%x", header.start, header.options, DF.size); //incomplete list
printf("%s", buf);