将二进制结构写入文件,意外结果?

not*_*orb 3 c

我正在尝试将打包的数据结构写出到二进制文件中,但是正如您从od -x下面看到的那样,结果的顺序并不符合预期。我在 64 位 Intel 系统上使用 gcc。有谁知道为什么顺序是错误的?它看起来不像字节序问题。

#include <stdio.h>
#include <stdlib.h>

struct B {
     char a;
     int b;
     char c;
     short d;
} __attribute__ ((packed));

int main(int argc, char *argv[])
{
     FILE *fp;
     fp = fopen("temp.bin", "w");

     struct B b = {'a', 0xA5A5, 'b', 0xFF};

     if (fwrite(&b, sizeof(b), 1, fp) != 1)
          printf("Error fwrite\n");

     exit(0);
}
Run Code Online (Sandbox Code Playgroud)

ASCII 61 是'a',所以b.a成员。ASCII 62 是'b',所以b.c成员。奇怪的0xA5A5是如何在序列中展开。

$ od -x temp.bin 
0000000 a561 00a5 6200 00ff
0000010
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 8

od -x将输入分组为 2 字节单元并交换它们的字节序。这是一种令人困惑的输出格式。用于-t x1单独保留字节。

$ od -t x1 temp.bin
0000000 61 a5 a5 00 00 62 ff 00
0000010
Run Code Online (Sandbox Code Playgroud)

或者,更容易记住,使用hd(hex dump) 而不是od(octal dump)。hd的默认格式不需要调整,而且它同时显示了十六进制和 ASCII 转储。

$ hd temp.bin
00000000  61 a5 a5 00 00 62 ff 00                           |a....b..|
00000008
Run Code Online (Sandbox Code Playgroud)