C语言中使用fwrite写入结构体到二进制文件的字节序困惑求解
问题分析与解决
你的结构体写入逻辑是正确的,问题出在十六进制dump工具的显示格式上,导致你误解了实际的字节顺序。
关键拆解步骤:
结构体与存储逻辑
你的结构体应该是类似这样的定义(按gdb输出和5字节大小推断):struct Data { int alphCount; // 4字节整数,Intel小端存储 char ascii; // 1字节字符 } __attribute__((packed));第一个结构体的
alphCount=58对应十六进制0x0000003a,小端存储时磁盘字节顺序为0x3a 0x00 0x00 0x00;ascii=97对应0x61,所以第一个结构体的实际磁盘字节流是:3a 00 00 00 61。dump工具的显示规则
你提供的dump结果(看起来是od -x这类工具的输出)是以2字节为单位,按大端序打印每个单位。也就是说,dump里的每个4字符分组(比如003a),实际对应的磁盘字节是把分组的后两位放在前面,前两位放在后面——即003a对应磁盘上的3a 00。验证匹配
拆解dump的前几个分组:003a→ 实际字节:3a 000000→ 实际字节:00 000161→ 实际字节:61 01
拼接起来的前5字节就是3a 00 00 00 61,完全符合你预期的小端存储结果。
再看第二个结构体(
alphCount=1,ascii=10):
实际字节流应为01 00 00 00 0a,对应dump里的0161的后一字节01,加上后续的0000(00 00)和0a00的前一字节00、后一字节0a,完全匹配。
总结
你的fwrite写入完全正确,只是dump工具的双字节大端显示方式让你产生了误解。如果想看到真实的字节顺序,可以使用按单字节打印的dump工具(比如od -t x1),这样就能直接看到3a作为第一个字节。
内容的提问来源于stack exchange,提问作者nakeydoln
相关产品推荐
相关产品推荐

