在big-endian和little-endian平台之间移动二进制文件



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

我的问题是当二进制文件从BE移动到LE平台时会发生什么。从这篇文章中,我可以看到磁盘上的数据字节顺序与平台上的内存字节顺序相同:https://stackoverflow.com/a/5751824

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

00000010 00000101
  • 使用wget在BE机器上下载此文件
  • 检查文件内容,它仍然是00000010 00000101

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

我的问题是当二进制文件从BE平台移动到LE平台时会发生什么。

文件字节应在完全不交换的情况下进行复制--字节应在所有机器上以相同的顺序出现,如逐字节详细说明的那样。

对于简单的文本来说,这并不重要,因为单个字节的序列本质上不是endian。

对于大多数其他内容,都会有一个定义的文件格式,它指定大于8位的数字字段的字节序。这就是您已经观察到的关于TCP/IP的内容,它定义了头的big-endian。

JPG、PNG等要么避免使用多字节数字,要么定义在使用多字节数值时如何解释文件中的字节。

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

对于多字节文本,Unicode使用了上面的一些功能,但更现代的编码UTF-8应该被解释为"UTF-8";简单的";字节序列(而不是多字节数(,并且不需要BOM或endianness概念。

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

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

最新更新