【问题标题】:Does golang provide htonl/htons?golang 提供 htonl/htons 吗?
【发布时间】:2013-09-25 03:00:14
【问题描述】:

在C编程中,当我想通过网络发送一个整数时,我们需要使用htonl()或htons()将整数从主机字节顺序转换 在发送之前对网络字节顺序进行处理。

但是在golang中,我查了net包,找不到类似htons/htonl的功能。那么在使用golang的时候应该如何发送整数呢?我需要实现 htons/htonl 我自己?

【问题讨论】:

    标签: network-programming go


    【解决方案1】:

    网络字节序只是大端,所以你可以使用encoding/binary包来执行编码。

    For example:

    data := make([]byte, 6)
    binary.BigEndian.PutUint16(data, 0x1011)
    binary.BigEndian.PutUint32(data[2:6], 0x12131415)
    

    或者,如果您正在写入io.Writer,则来自同一包的binary.Write() 函数可能更方便(同样,使用binary.BigEndian 值作为order 参数)。

    【讨论】:

    • 提示:binary.Read() 可用于直接从网络连接读取数据。
    • 在大端机器上运行这个怎么样?由于该代码交换了字节,它不会把它搞砸吗?
    • nvm,看起来它使用轮班,所以它在所有平台上都能正常工作。
    • 对。 binary.BigEndian 读取和写入大端数据到 []byte 切片,无论您在哪种架构上运行。从字节交换的角度考虑它只会使事情复杂化。
    • 如何在socket() 或其他需要uint16 的系统调用中使用它? binary.BigEndian.PutUint16() 以正确的顺序提供字节,但需要将它们转换为 uint16 才能使用。如果我使用相同的binary.BigEndian lib,它只会让它们回到主机顺序。
    【解决方案2】:

    我想你要的是ByteOrder in encoding/binary

    ByteOrder 指定如何将字节序列转换为 16、32 或 64 位无符号整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2016-10-30
      • 2018-02-07
      • 2019-02-10
      相关资源
      最近更新 更多