网络字节顺序和字节顺序问题

时间:2014-04-06 02:24:38

标签: c++ c endianness

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

  1. 但任何人都可以告诉我谁将负责这次转换。
  2. 代码开发人员是否真的担心这个字节序?如果是,请您告诉我们需要注意的示例(如果是C,C ++)。

3 个答案:

答案 0 :(得分:3)

网络与本机字节顺序重要的第一个地方是创建套接字并指定IP地址和端口号。这些必须按照正确的顺序排列,否则你最终不会与正确的计算机通话,或者如果你映射的是IP地址而不是端口号,你最终会在正确的计算机上与错误的端口通话。

程序员有责任以正确的顺序获取地址。有htonl()等功能可以从主机(h)转换为网络(n)顺序; l表示'long'表示'4字节'; s表示'short'表示'2字节'(名称可以追溯到64位系统之前的时代)。

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

请注意,IBM大型机使用EBCDIC而不是ASCII或ISO 8859-x字符集(至少默认情况下),并且浮点格式不是IEEE 744(将该标准预先约会十年或更长时间)。因此,这些问题对于与大型机通信时的处理至关重要。两端的计划必须同意每一端如何理解另一方。一些协议定义字节顺序(例如网络字节顺序);其他人定义'发件人做对'或'接收者做对'或'客户做对'或'服务器做对',将转换工作量放在系统的不同部分。

文本协议(特别是那些使用SBCS的协议)的一个优点是它们可以避免字节序问题 - 以将文本转换为值和返回为代价,但与甚至千兆网络速度相比,计算成本低廉。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

只需按接收者可以理解的正确顺序发送内容,

即。使用http://www.manpagez.com/man/3/ntohl/及其同类。