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

无符号短整数字节交换:二进制文件写入功能调试求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:56:26