【发布时间】:2021-12-25 21:45:05
【问题描述】:
我知道无论主机字节序如何,网络字节顺序都是大字节序。
我的问题是当二进制文件从 BE 平台移动到 LE 平台时会发生什么。 从这篇文章我可以看到磁盘上的数据字节顺序与平台的内存字节顺序相同: https://stackoverflow.com/a/5751824
所以假设我在 LE 机器上有一个小的二进制文件,其内容按 LE 顺序 2 5:
(注意我已经用xxd把它变成了一个实际的二进制文件)
00000010 00000101
- 使用
wget在 BE 机器上下载此文件。 - 签出文件内容仍然是
00000010 00000101。
在传输之前文件不是必须反转为00000101 00000010吗?如果是这样的话
BE机器收到后不会按网络顺序存储它吗?下载后文件内容怎么不反转?
【问题讨论】:
-
网络字节序是网络字节序,不是大端也不是小端。它是网络字节顺序。然后,您将了解外设如何将该数据包数据映射到处理器的地址空间或将数据复制到某处的内存中。然后是架构和访问类型/大小。那么术语大端至少有不同的定义,你可以让大端不以你认为网络流中的 0x11、0x22、0x33、0x44 可以是 0x11223344 或 0x44332211 的方式访问网络字节顺序数据取决于处理器的大端序...
-
使用并尝试将事物隔离到字节序桶中往往会比成功带来更多的痛苦。而是做你的系统工程。数据是如何进入外设的,它是如何或可以呈现给处理器的,处理器通过模式或指令访问选项/功能是什么,等等。这些都不需要术语字节序。
-
文件就是文件,就像上面的语句一样,一件事与另一件事无关,文件是位或字节的序列,正确的传输将通过任何介质(网络,无线、硬盘到拇指驱动器、光驱等)到其他机器的硬盘驱动器/ssd,与操作系统、操作系统版本、文件系统类型、处理器架构等无关。
-
网络本身的物理接口不是固定的,每种技术都有一种(如果不超过一种)方式将比特切碎并通过媒体发送它们然后将它们重新组合在一起,只是有多个层在物理层内,不包括也涉及的教科书网络层本身。然后在这些网络层之上,你有文件层和操作系统等,以确保文件在理想情况下,一点一点地显示出来。
-
然后是程序员的工作,最好不要使用字节序来读/写文件。做你的系统工程,不要仅仅假设 BE 或 LE 意味着任何相关的东西,因为它没有。犯下跨编译域使用结构的主要罪行会导致字节序问题。如果需要和更便携的代码,可以轻松避免和无字节序。
标签: networking cpu-architecture endianness