【问题标题】:Network byte order and endianness issues网络字节顺序和字节序问题
【发布时间】:2014-05-18 07:55:51
【问题描述】:

我在互联网上读到网络的标准字节顺序是大端,也称为网络字节顺序。在网络上传输数据之前,首先将数据转换为网络字节序(大端)。

  1. 但是谁能告诉我谁会负责这个转换。
  2. 代码开发人员是否真的担心这种字节顺序?如果是,请告诉我我们需要注意的示例(在 C、C++ 的情况下)。

【问题讨论】:

  • 无论何时序列化数据(即通过某种数据流发送内存中的整数),您都需要考虑这一点。您必须确保另一端可以检索到您发送的相同值。
  • 虽然 Big-Endian 被称为网络字节顺序(许多网络协议有充分的理由使用它),但您总是需要担心您手头的特定协议,这可能会有所不同。

标签: c++ c endianness


【解决方案1】:

网络与本机字节顺序的第一个问题是创建套接字并指定 IP 地址和端口号。这些顺序必须正确,否则您将无法与正确的计算机通信,或者如果您映射了 IP 地址而不是端口号,您最终将与正确计算机上的错误端口通信。

程序员有责任以正确的顺序获取地址。有像htonl() 这样的函数,可以从主机(h)转换为网络(n)顺序; l 表示'long',意思是'4 bytes'; s 表示“短”,意思是“2 个字节”(名称可以追溯到 64 位系统之前的时代)。

另一次重要的是,您是通过在套接字上正确设置的网络连接还是通过文件在两台计算机之间传输二进制数据。使用单字节代码集 (SBCS) 或 UTF-8,您不会遇到文本数据问题。对于多字节代码集 (MBCS)、UTF-16LE 与 UTF-16BE 或 UTF-32,您必须担心字符中的字节顺序,但字符会一个接一个地出现。如果您将 32 位整数作为 32 位数据发送,接收端需要知道第一个字节是 MSB(最高有效字节 - 用于大端)还是 LSB(最低有效字节 - 用于小端) ) 的 32 位数量。与 16 位整数或 64 位整数类似。使用浮点,您可能会遇到额外的问题,即不同的计算机可以使用不同的浮点格式,与字节顺序问题无关。由于 IEEE 744,这比以前更容易解决。

请注意,IBM 大型机使用 EBCDIC 而不是 ASCII 或 ISO 8859-x 字符集(至少在默认情况下),并且浮点格式不是 IEEE 744(比该标准早十年或更长时间)。因此,在与大型机通信时,这些问题至关重要。两端的程序必须就每一端如何理解对方达成一致。一些协议定义了字节顺序(例如网络字节顺序);其他人定义“发送方正确”或“接收方正确”或“客户端正确”或“服务器正确”,将转换工作负载置于系统的不同部分。

文本协议(尤其是使用 SBCS 的协议)的一个优点是它们避免了字节顺序问题——代价是将文本转换为值并返回,但与千兆网络速度相比,计算成本很低。

【讨论】:

    【解决方案2】:

    只需按照收件人可以理解的正确顺序发送内容,

    即使用http://www.manpagez.com/man/3/ntohl/ 之类的。

    【讨论】:

      【解决方案3】:

      在 C 和 C++ 中,您将不得不担心低级网络代码中的字节顺序。通常,在处理多字节数据类型时,序列化和反序列化代码将调用一个函数或宏来调整字节序 - 在小字节序机器上反转它,在大字节序机器上什么也不做。

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 2015-03-30
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多