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

时间:2014-09-10 08:38:06

标签: c printf hex buffer

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

3 个答案:

答案 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);