7

将 little-endian 系统中的数据转换为网络字节顺序所需的底层转换是什么?对于 2 字节和 4 字节数据,有众所周知的函数(如 htons、ntohl 等)来封装更改,对于 1 字节数据的字符串(如果有的话)会发生什么?

此外,Wikipedia 暗示 little-endian 是 big-endian 的镜像,但如果这是真的,为什么我们需要对 2 字节和 4 字节数据进行特定处理?

文章“论圣战和和平恳求”似乎暗示有许多不同风格的 little-endian——这是一篇古老的文章——这仍然适用吗?像 Java 类文件开头那样的字节顺序标记是否仍然需要?

最后,网络字节顺序是否需要 4 字节对齐?

4

5 回答 5

6

假设您在一个b字节数组中有 ASCII 文本“BigE”。

b[0] == 'B'
b[1] == 'i'
b[2] == 'g'
b[3] == 'E'

这也是字符串的网络顺序。

如果将其视为 32 位整数,则为

'B' + ('i' << 8) + ('g' << 16) + ('E' << 24) 

在一个小端平台和

'E' + ('g' << 8) + ('i' << 16) + ('B' << 24) 

在大端平台上。

如果您分别转换每个 16 位作品,您将不会得到这些

'i' + ('B' << 8) + ('E' << 16) + ('g' << 24) 

这就是为什么ntohl并且ntohs都是必需的。

换句话说,ntohs交换 16 位短字节内的字节,并ntohl颠倒其 32 位字的四个字节的顺序。

于 2009-01-20T22:44:58.367 回答
0

2 和 4 字节数据的特定处理函数利用了处理器指令对特定数据大小进行操作这一事实。运行 1 字节反转函数四次肯定比使用更宽的指令一次对所有四个字节执行相同(尽管规模增加)操作效率低。

于 2009-01-20T22:45:58.287 回答
0

1 字节数据不需要字节序之间的任何转换(这是 UTF-8 优于 UTF-16 和 UTF-32 字符串编码的优势)。

于 2009-01-20T22:46:13.777 回答
0

网络字节顺序是否需要 4 字节对齐?

通过网络传输的字节不需要特定的对齐方式。您的处理器可能需要在内存中进行某种对齐,但解决差异取决于您。x86 家族通常不会提出这样的要求。

于 2009-01-20T22:56:31.120 回答
0

基本思想是所有多字节类型都必须颠倒它们的字节顺序。四字节整数将交换字节 0 和 3,交换字节 1 和 2。一个两字节整数将交换字节 0 和 1。一个字节的字符不会被交换。

这有两个非常重要的含义,非实践者和新手并不总是意识到:

  1. (ASCII) 不接触字符串。
  2. 没有可能盲算法来字节交换通用“数据”。您必须知道所有数据的类型,并按照其类型所需的方式交换每个项目。
于 2009-01-20T23:08:24.760 回答