在大端和小端平台之间移动二进制文件

Moving binary files between big endian and little endian platforms

我知道无论主机字节序如何,网络字节顺序都是大字节序。

我的问题是将二进制文件从 BE 平台移动到 LE 平台时会发生什么。 从这个 post 我可以看到磁盘上的数据字节顺序与平台的内存字节顺序相同:

所以假设我在 LE 机器上有一个小的二进制文件,其中的内容按 LE 顺序 2 5: (注意我已经用 xxd 把它变成了一个实际的二进制文件)

00000010 00000101

文件在传输前不是必须反转为00000101 00000010吗?如果是这样 BE 机器在收到它后不会按网络顺序存储它吗?下载后文件内容不反转怎么办?

内存被组织为字节序列,采用双端字节序,因此数据只是字节序列,例如 ASCII 或 UTF8,没有问题。当 2、4 或 8 个字节的组被解释为数字时,问题就开始了,此时您需要定义组中的第一个或最后一个字节是最不重要的。这就是大端和小端的区别。

如果您使用 UTF-16 表示文本,其中文本被编码为 2 字节值的序列,那么字节顺序很重要,实际上 UTF-16 的一部分是零宽度不间断 space插入开头以指示字节顺序。

My question is what happens when a binary file is moved from a BE to LE platform.

文件字节应该被复制而不被交换 — 字节应该在所有机器上以相同的顺序出现,如逐字节详细说明的那样。

对于简单的文本,这无关紧要,因为各个字节的序列本质上不是字节序的。

对于大多数其他内容,将有一个定义的文件格式,它指定大于 8 位的数字字段的字节顺序。这就是您已经观察到的关于 TCP/IP 的内容,它为 headers.

定义了大端

JPG、PNG 和其他格式要么避免使用 multi-byte 数字,要么定义在使用 multi-byte 数值时如何解释文件中的字节。

某些数据格式将使用字节顺序标记 BOM,它是允许编写者选择字节顺序的灵活格式的一部分(因此,如果需要,可以选择适合书写系统的字节顺序) ),并且,这允许 reader 确定文件的字节顺序。

对于 multi-byte 文本,Unicode 使用了上述一些特性,但更现代的编码 UTF-8 应该被解释为“简单”的字节序列(而不是 multi-byte 数字)并且不需要 BOM 或字节序概念。