【问题标题】:Reading in bytes from a struct one at a time一次从结构中读取一个字节
【发布时间】:2016-01-31 01:28:58
【问题描述】:

我有一个由 6 个 16 位整数和 1 个 32 位整数(总共 16 个字节)组成的结构,我试图一次读取一个结构。目前我使用

printf("%.4x %.4x %.4x %.4x %.4x %.4x %.4x\n", );

以 7 个结构成员作为以下参数。

我的输出如下:

 0001 0100 0010 0002 0058 0070 464c45

我想将其格式化为:

01 00 00 01 10 00 02 00  58 00 70 00 45 4c 46 00

我一直在到处寻找以尝试找出如何正确格式化它。任何帮助将不胜感激!提前谢谢你!

【问题讨论】:

  • 请注意,您所需的输出格式假定为 little-endian 系统(或者,更迂腐地,以字节在 little-endian 系统中自然出现的顺序呈现数据)。这不是一个大问题,但你至少应该模糊地意识到这个问题。发布的解决方案效果很好,并在小端系统上提供了所需的结果——您必须在大端系统上更改所需的输出(到 00 01 01 00 00 10 00 02 00 58 00 70 00 46 4c 45),或者在演示代码中做更多的工作。
  • 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here?What do I do when someone answers my question?

标签: c printing formatting printf byte


【解决方案1】:

您可以将 unsigned char 指针移到结构上,逐字节读取(我希望我不要将其与 C++ 混淆,在执行此类操作时可能会发生未定义的行为 ):

#include <stdio.h>
#include <stdint.h>

struct Data {
    int16_t small[6];
    int32_t big;
};

void funky_print(struct Data const * data) {
    unsigned char const * ptr = (unsigned char const *)data;
    size_t i;
    printf("%.2hhx", *ptr);
    ++ptr;
    for (i = 1; i < sizeof(*data); ++i) {
        printf(" %.2hhx", *ptr);
        ++ptr;
    }
}

int main(void) {
    struct Data d = {{0xA0B0, 0xC0D0, 84, 128, 3200, 0}, 0x1BADCAFE};
    funky_print(&d);
    return 0;
}

(Live here)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多