代码之家  ›  专栏  ›  技术社区  ›  Paul W Homer

小端系统使用哪些转换将数据转换为网络顺序?

  •  7
  • Paul W Homer  · 技术社区  · 17 年前

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

    此外,维基百科暗示小字节序是大端序的镜像,但如果这是真的,为什么我们需要对2字节和4字节的数据进行特定的处理?

    《论圣战与和平呼吁》一文似乎暗示,小端序有许多不同的风格——这是一篇古老的文章——这仍然适用吗?仍然需要像Java类文件开头那样的字节顺序标记吗?

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

    5 回复  |  直到 9 年前
        1
  •  6
  •   Doug Currie    17 年前

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

    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 两者都是必需的。

    换言之, 主机到网络 交换16位短内的字节,以及 ntohl 反转其32位字的四个字节的顺序。

        2
  •  0
  •   Sparr    17 年前

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

        3
  •  0
  •   workmad3    17 年前

    1字节数据不需要在端号之间进行任何转换(对于字符串编码,UTF-8比UTF-16和UTF-32更有优势)。

        4
  •  0
  •   Mark Ransom    17 年前

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

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

        5
  •  0
  •   T.E.D.    17 年前

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

    有两个 非常重要 这意味着非从业者和新手并不总是意识到:

    1. (ASCII)字符串不被触摸。
    2. 这是 字节交换通用“数据”的可能盲算法。您必须知道所有数据的类型,并按照其类型所需的方式交换每个项目。