You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中使用fwrite写入结构体到二进制文件的字节序困惑求解

问题分析与解决

你的结构体写入逻辑是正确的,问题出在十六进制dump工具的显示格式上,导致你误解了实际的字节顺序。

关键拆解步骤:

  1. 结构体与存储逻辑
    你的结构体应该是类似这样的定义(按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。

  2. dump工具的显示规则
    你提供的dump结果(看起来是od -x这类工具的输出)是以2字节为单位,按大端序打印每个单位。也就是说,dump里的每个4字符分组(比如003a),实际对应的磁盘字节是把分组的后两位放在前面,前两位放在后面——即003a对应磁盘上的3a 00。

  3. 验证匹配
    拆解dump的前几个分组:

    • 003a → 实际字节:3a 00
    • 0000 → 实际字节:00 00
    • 0161 → 实际字节: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 00:36:21