我有两个对象,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));
答案 0 :(得分:2)
根据给出的部分代码,它没有多少想法,但有些观点需要做。
在复制到缓冲区之前总是做一个memset。
memset(buffer, 0, sizeof(buffer))
这会阻止你获得垃圾。
答案 1 :(得分:1)
对象不一定要打包在一起。实际上,大多数编译器都以8字节边界对齐对象,以便以更高的速度访问数据。对象之间的字节只是未初始化(有时运行时环境的调试版本将填补无效数据的空白)。
答案 2 :(得分:1)
这不是一种正确的方法[因为编译器优化和对齐]来实现你想要的。
但是,只是为了一个逻辑建议,在你的代码中,改变
for (int i = 0; i < sizeof(buffer); i++)
到
for (int i = 0; i < (sizeof(Header) + sizeof(Data_Format)); i++)
。
这将限制循环直到有效输入。请记住,即使在这种变化之后,你也不能保证[实际上,不应该]得到正确的结果。
修改强>
您可以使用snprintf()
来实现目标。常见用法类似于
snprintf(buf, sizeof(buf), "%x%x%x", header.start, header.options, DF.size); //incomplete list
printf("%s", buf);