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

C语言中小端十六进制转储转大端时冗余字节问题排查

解决fwrite写入多余字节的问题

嘿,这个问题我太熟了!本质是你在fwrite里指定的写入字节数不对,导致把变量的多余填充字节也写到文件里了。

问题根源分析

  • 当你用int类型时,sizeof(int)在绝大多数系统上是4字节。哪怕你只需要写入0xCADE这2个字节,fwrite(&swapped, sizeof(int), 1, dest_file)会把整个4字节的swapped变量都写进去,后面多出来的ca 00就是这个int变量的剩余字节内容。
  • 改成unsigned short后,unsigned short本身是2字节,但你没改fwrite里的sizeof(int),所以依然会强制写入4字节,后面的00 00就是系统给变量补的填充字节。

修复方案

方案1:匹配变量类型的大小

把fwrite的第二个参数改成对应变量的大小,比如用unsigned short时:

// 声明变量
unsigned short int code = 0xCADE;
// 字节交换
unsigned short int swapped = (code>>8) | (code<<8);
// 打开文件
FILE *dest_file = fopen(filename, "wb");
// 写入2字节(unsigned short的大小)
fwrite(&swapped, sizeof(unsigned short), 1, dest_file);

方案2:明确指定写入字节数

如果你确定只需要写2字节,也可以直接写死数值,更直观:

fwrite(&swapped, 2, 1, dest_file);

方案3:用固定宽度类型更稳妥

为了避免不同系统上short长度可能存在的差异(虽然很少见),可以用<stdint.h>里的uint16_t(固定16位无符号整数):

#include <stdint.h>

uint16_t code = 0xCADE;
uint16_t swapped = (code >> 8) | (code << 8);
FILE *dest_file = fopen(filename, "wb");
fwrite(&swapped, sizeof(uint16_t), 1, dest_file);

验证效果

用上面任意一种方法修改后,文件的十六进制转储就会变成你期望的:

0000000 ca de 0000004

内容的提问来源于stack exchange,提问作者J_code

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:35