C-为什么我的缓冲区打印不正确



我有两个对象,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);

最新更新