【问题标题】:C - Why is my buffer not printing properly?C - 为什么我的缓冲区不能正确打印?
【发布时间】:2014-11-03 19:58:48
【问题描述】:

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

【问题讨论】:

  • 向我们展示声明和填充buffer 的代码
  • 部分代码没有给出关于最终输出的任何想法。
  • 您的问题中代码或信息不足,建议阅读the Stack Overflow question checklist。您可能还想了解如何创建Minimal, Complete, and Verifiable example
  • A struct 可能包含填充字节(垃圾),memcpying 和打印垃圾似乎不是一个好主意,而是复制 struct 的成员
  • 显示您如何在struct Headerstruct Data_Format 中声明字段类型,您可能有签名问题

标签: c printf hex buffer


【解决方案1】:

这不是 [因为编译器优化和对齐] 来实现您想要的正确方法。

但是,只是为了一个合乎逻辑的建议,在你的代码中,改变

for (int i = 0; i &lt; sizeof(buffer); i++)

for (int i = 0; i &lt; (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);

【讨论】:

  • 这更像是一个评论而不是一个答案,因为它没有解决 OP 问题:输出仍然是“垃圾”
  • 您的编辑确实提出了一个解决方案:downvote removed :)
【解决方案2】:

从给出的部分代码来看,它并没有给出太多想法,但需要做一些事情。

在处理缓冲区之前总是做一个 memset。

memset(buffer, 0, sizeof(buffer)) 

这会阻止你得到垃圾。

【讨论】:

  • 击球手这应该作为评论。
【解决方案3】:

这些对象不一定要打包在一起。实际上,大多数编译器在 8 字节边界处对齐对象,以便以更高的速度访问数据。对象之间的字节将保持未初始化状态(有时运行环境的调试版本会用无效数据填补空白)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2021-04-13
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多