c++ - C++中文件的Big Endian和Little Endian

标签 c++ file endianness

我正在尝试编写一些独立于处理器的代码来以大端格式编写一些文件。我在下面有一个代码示例,但我不明白为什么它不起作用。它应该做的就是让字节按大端顺序将数据的每个字节一个一个地存储起来。在我的实际程序中,我会将单个字节写入文件,因此无论处理器架构如何,我都会在文件中获得相同的字节顺序。

#include <iostream>

int main (int argc, char * const argv[]) {
 long data = 0x12345678;
 long bitmask = (0xFF << (sizeof(long) - 1) * 8);
 char byte = 0;

    for(long i = 0; i < sizeof(long); i++) {
  byte = data & bitmask;
  data <<= 8;
 }
    return 0;
}

出于某种原因,byte 的值始终为 0。这让我感到困惑,我正在查看调试器并看到:

数据 = 00010010001101000101011001111000 位掩码 = 11111111000000000000000000000000

我认为 data & mask 会给出 00010010,但它每次都只生成字节 00000000!怎么可能是他的?我已经为 little endian 顺序编写了一些代码,效果很好,请参见下文:

#include <iostream>

int main (int argc, char * const argv[]) {
 long data = 0x12345678;
 long bitmask = 0xFF;
 char byte = 0;

    for(long i = 0; i < sizeof(long); i++) {
  byte = data & bitmask;
  data >>= 8;
 }
    return 0;
}

为什么小端可以工作而大端不行?感谢您的帮助:-)

最佳答案

您应该使用标准函数 ntohl() 和亲戚为此。它们对显式大小的变量(即 uint16_tuin32_t )而不是特定于编译器的 long 进行操作,这是可移植性所必需的。

某些平台在 <endian.h> 中提供 64 位版本

关于c++ - C++中文件的Big Endian和Little Endian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2161410/

相关文章:

c++ - 使用正则表达式解析命令

java - 当我复制两个空路径时会发生什么并且为什么它不抛出异常?

file - 谷歌驱动器 : read-only without authorisation on external site

使用不同模式下的文件进行 C 编程?

char16_t 和 char32_t 字节序

c++ - 如何在Qt中使用STL算法?

c++ - 解析这个表达式!

c++ - *it++ 如何对输出迭代器有效?

assembly - 火星MIPS模拟器是大端还是小端

c - long 和 char[] 的 union ,字节顺序