交换无符号短整数的字节
Swapping bytes of unsigned short integer
我有一个部分工作的功能,涉及写入文件。
我有一个 arr
类型的 unsigned short int
数组,每个元素都必须以二进制格式写入文件。
我最初的解决方案是:
for(i = 0; i < ROWS; i++) {
fwrite(&arr[i], 1, sizeof(unsigned short int), source);
}
上面的代码在将 unsigned short ints
写入文件时有效。此外,source
是指向以二进制格式写入的文件的指针。但是,我需要交换字节,但在这样做时遇到了麻烦。本质上,作为 abcd
写入文件的内容应该是 cdab
.
我的尝试:
unsigned short int toWrite;
unsigned short int swapped;
for(i = 0; i < ROWS; i++) {
toWrite = &arr[i];
swapped = (toWrite >> 8) | (toWrite << 8);
fwrite(swapped, 1, sizeof(unsigned short int), source);
}
但是我得到了一个分段错误核心转储。我阅读并使用了这个问题的 upvoted 答案 - convert big endian to little endian in C [without using provided func] - 但它似乎没有用。有什么建议么?谢谢!
你的尝试大错特错(你复制的答案没问题,问题不在交换本身)
首先,您要获取要交换的值的 地址,然后将 值 而不是地址传递给写。应该是:
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);
}
我确信编译器已就此警告过您。警告很有用。
欢迎来到不可移植二进制格式的世界。
交换数字是一种容易出错的 hack,因为它使程序不可移植:是否交换值取决于您编译的系统的字节顺序和 运行 程序。您的程序有一个非常简单的错误:您传递了 swapped
的值而不是它的地址。您可以使用以下方法修复它:
fwrite(&swapped, sizeof(swapped), 1, source);
然而,解决您的问题的更好方法是在您的程序中显式处理字节顺序。这是一种以大端顺序写入数字的便携式解决方案:
/* 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);
}
请注意,为输出文件命名流变量有点令人困惑 source
。
我有一个部分工作的功能,涉及写入文件。
我有一个 arr
类型的 unsigned short int
数组,每个元素都必须以二进制格式写入文件。
我最初的解决方案是:
for(i = 0; i < ROWS; i++) {
fwrite(&arr[i], 1, sizeof(unsigned short int), source);
}
上面的代码在将 unsigned short ints
写入文件时有效。此外,source
是指向以二进制格式写入的文件的指针。但是,我需要交换字节,但在这样做时遇到了麻烦。本质上,作为 abcd
写入文件的内容应该是 cdab
.
我的尝试:
unsigned short int toWrite;
unsigned short int swapped;
for(i = 0; i < ROWS; i++) {
toWrite = &arr[i];
swapped = (toWrite >> 8) | (toWrite << 8);
fwrite(swapped, 1, sizeof(unsigned short int), source);
}
但是我得到了一个分段错误核心转储。我阅读并使用了这个问题的 upvoted 答案 - convert big endian to little endian in C [without using provided func] - 但它似乎没有用。有什么建议么?谢谢!
你的尝试大错特错(你复制的答案没问题,问题不在交换本身)
首先,您要获取要交换的值的 地址,然后将 值 而不是地址传递给写。应该是:
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);
}
我确信编译器已就此警告过您。警告很有用。
欢迎来到不可移植二进制格式的世界。
交换数字是一种容易出错的 hack,因为它使程序不可移植:是否交换值取决于您编译的系统的字节顺序和 运行 程序。您的程序有一个非常简单的错误:您传递了 swapped
的值而不是它的地址。您可以使用以下方法修复它:
fwrite(&swapped, sizeof(swapped), 1, source);
然而,解决您的问题的更好方法是在您的程序中显式处理字节顺序。这是一种以大端顺序写入数字的便携式解决方案:
/* 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);
}
请注意,为输出文件命名流变量有点令人困惑 source
。