无符号短整数字节交换:二进制文件写入功能调试求助
解决unsigned short数组字节交换后写入文件的问题
看来你是遇到了大小端字节序转换的需求对吧?其实实现字节交换并写入文件并不难,这里给你两种实用的方案:
方案一:先交换元素字节序再写入
先定义一个简单的字节交换宏或者函数,把每个unsigned short的高低字节互换,再用你熟悉的fwrite写入文件:
// 定义交换unsigned short高低字节的宏 #define SWAP_SHORT(val) ((((val) >> 8) & 0x00FF) | (((val) << 8) & 0xFF00)) // 修改后的写入循环 for(int i = 0; i < ROWS; i++) { unsigned short swapped_val = SWAP_SHORT(arr[i]); fwrite(&swapped_val, sizeof(unsigned short int), 1, source); // 这里也可以保持你原来的参数顺序:fwrite(&swapped_val, 1, sizeof(unsigned short int), source); 效果完全一致 }
这个宏的原理很直观:把原数值右移8位取出高字节,左移8位取出低字节,再用位或操作拼接成交换后的完整数值。
方案二:直接拆分字节按交换顺序写入
如果不想修改原数组或者需要节省内存,可以直接把每个unsigned short拆成两个单字节,按交换后的顺序分别写入:
for(int i = 0; i < ROWS; i++) { // 取出原数值的高字节和低字节 unsigned char original_high = (arr[i] >> 8) & 0xFF; unsigned char original_low = arr[i] & 0xFF; // 先写原高字节,再写原低字节,实现字节交换 fwrite(&original_high, 1, 1, source); fwrite(&original_low, 1, 1, source); }
这种方式不需要额外的变量存储交换后的完整数值,直接操作单个字节写入,适合处理超大数组的场景。
额外小提示
如果是跨平台的字节序转换需求,也可以用标准库的htons()函数(将主机字节序转换为网络字节序,网络字节序是大端),不过这个函数需要对应头文件:Linux下包含<arpa/inet.h>,Windows下包含<winsock2.h>。自己实现字节交换的话则更轻量化,不需要依赖网络相关库。
内容的提问来源于stack exchange,提问作者rubyquartz
相关产品推荐
相关产品推荐

