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
相关产品推荐
相关产品推荐

