C-交换未签名的短整数字节



我具有部分工作功能,涉及写入文件。

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

我的Inital解决方案是:

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);
}

但是,我得到了一个细分故障核心转储。我阅读并使用了这个问题的投票答案 - 将大恩迪安转换为c [不使用提供的func]中的小恩迪安 - 但似乎无法正常工作。有什么建议么?谢谢!

您的尝试是非常错误的(并且您从中复制的答案还可以,问题本身不是在交换本身中(

首先,您要进行交换值的地址,然后您要传递 value 而不是要写的地址。应该是:

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);  
}

我很肯定编译器为此警告您。警告很有用。

欢迎进入非便携式二进制格式的世界。

交换数字是一个容易出错的黑客,因为它使程序非便携式:交换值是否取决于您编译并运行程序的系统的endianness。您的程序有一个非常简单的错误:您传递了swapped的值,而不是其地址。您可以使用:

进行修复:
fwrite(&swapped, sizeof(swapped), 1, source);

然而,解决问题的更好解决方案是在程序中明确处理Endianges。这是一个可移植的解决方案,可以按大端订单编写数字:

/* 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的流变量有些混乱。

最新更新