golang是否提供了htonl/htons?

Nan*_*iao 19 network-programming go

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

但是在golang中,我检查了网络包,并且找不到像htons/htonl这样的类似函数.那么在使用golang时我应该如何发送整数?我需要自己实现htons/htonl吗?

Jam*_*dge 24

网络字节顺序只是大端,因此您可以使用该encoding/binary包执行编码.

例如:

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

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

  • 提示:binary.Read() 可用于直接从网络连接读取数据。 (2认同)
  • 当然@JamesHenstridge。这是一个具体的例子。您想要打开一个原始套接字来侦听 Linux 上的所有以太网数据包。`syscall.Socket()` 的第三个参数应该是 `syscall.ETH_P_ALL`。但这是根据您本地字节顺序的“int”。网络需要bigendian。您的系统可能很大也可能很小。那你转换还是不转换?`htons` 应该在了解本地字节顺序的情况下做到这一点。 (2认同)

Int*_*net 5

我认为你是什么之后ByteOrderencoding/binary.

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