C 交换无符号短整数的字节

C 交换无符号短整数的字节,c,bit-manipulation,byte,endianness,C,Bit Manipulation,Byte,Endianness,我有一个部分工作的功能,包括写入文件 我有一个数组,arr,类型为unsigned short int,每个元素必须以二进制格式写入文件 我最初的解决方案是: for(i = 0; i < ROWS; i++) { fwrite(&arr[i], 1, sizeof(unsigned short int), source); } 然而,我得到了一个分割错误的核心转储结果。我阅读并使用了对这个问题的投票结果——但它似乎不起作用。有什么建议吗?谢谢 您的尝试是非常错误的(而且

我有一个部分工作的功能,包括写入文件

我有一个数组,
arr
,类型为
unsigned short int
,每个元素必须以二进制格式写入文件

我最初的解决方案是:

for(i = 0; i < ROWS; i++) {
    fwrite(&arr[i], 1, sizeof(unsigned short int), source);
}

然而,我得到了一个分割错误的核心转储结果。我阅读并使用了对这个问题的投票结果——但它似乎不起作用。有什么建议吗?谢谢

您的尝试是非常错误的(而且您从中复制的答案是正确的,问题不在于交换本身)

首先获取要交换的值的地址,然后传递值而不是要写入的地址。应该是:

unsigned short int toWrite;
unsigned short int swapped;
for(i = 0; i < ROWS; i++){
        toWrite = arr[i];
        swapped = (toWrite >>8) | (toWrite <<8); // that part is OK
        fwrite(&swapped, 1 , sizeof(unsigned short int) , source);  
}
unsigned short int-toWrite;
无符号短整数交换;
对于(i=0;iswapped=(toWrite>>8)|(toWrite欢迎来到非便携二进制格式的世界

交换数字是一种容易出错的黑客行为,因为它使程序不可移植:是否交换值取决于编译和运行程序的系统的终结性。您的程序有一个非常简单的错误:您传递的是
swapped
的值,而不是它的地址。您可以使用以下方法修复它:

fwrite(&swapped, sizeof(swapped), 1, source);
但解决问题的更好方法是在程序中显式处理endianness。这是一个可移植的解决方案,用于按大端顺序写入数字:

/* writing 16 bit unsigned integers in big endian order */
for (i = 0; i < ROWS; i++) {
    putc(arr[i] >> 8, source);
    putc(arr[i] & 255, source);
}
/* writing 16 bit unsigned integers in little endian order */
for (i = 0; i < ROWS; i++) {
    putc(arr[i] & 255, source);
    putc(arr[i] >> 8, source);
}
/*以大端顺序写入16位无符号整数*/
对于(i=0;i>8,来源);
putc(arr[i]&255,来源);
}
如果您希望以小尾端顺序书写,则这是另一个版本:

/* writing 16 bit unsigned integers in big endian order */
for (i = 0; i < ROWS; i++) {
    putc(arr[i] >> 8, source);
    putc(arr[i] & 255, source);
}
/* writing 16 bit unsigned integers in little endian order */
for (i = 0; i < ROWS; i++) {
    putc(arr[i] & 255, source);
    putc(arr[i] >> 8, source);
}
/*以小尾数顺序写入16位无符号整数*/
对于(i=0;i>8,来源);
}
请注意,为输出文件命名流变量有点混乱。
source

fwrite(&swapped,1,sizeof(unsigned short int),source);
fwrite需要一个地址。编译器可能已经警告过您。请阅读警告。另外
toWrite=arr[i];
或者您交换地址。。。