【发布时间】:2013-09-25 03:00:14
【问题描述】:
在C编程中,当我想通过网络发送一个整数时,我们需要使用htonl()或htons()将整数从主机字节顺序转换 在发送之前对网络字节顺序进行处理。
但是在golang中,我查了net包,找不到类似htons/htonl的功能。那么在使用golang的时候应该如何发送整数呢?我需要实现 htons/htonl 我自己?
【问题讨论】:
在C编程中,当我想通过网络发送一个整数时,我们需要使用htonl()或htons()将整数从主机字节顺序转换 在发送之前对网络字节顺序进行处理。
但是在golang中,我查了net包,找不到类似htons/htonl的功能。那么在使用golang的时候应该如何发送整数呢?我需要实现 htons/htonl 我自己?
【问题讨论】:
网络字节序只是大端,所以你可以使用encoding/binary包来执行编码。
data := make([]byte, 6)
binary.BigEndian.PutUint16(data, 0x1011)
binary.BigEndian.PutUint32(data[2:6], 0x12131415)
或者,如果您正在写入io.Writer,则来自同一包的binary.Write() 函数可能更方便(同样,使用binary.BigEndian 值作为order 参数)。
【讨论】:
binary.BigEndian 读取和写入大端数据到 []byte 切片,无论您在哪种架构上运行。从字节交换的角度考虑它只会使事情复杂化。
socket() 或其他需要uint16 的系统调用中使用它? binary.BigEndian.PutUint16() 以正确的顺序提供字节,但需要将它们转换为 uint16 才能使用。如果我使用相同的binary.BigEndian lib,它只会让它们回到主机顺序。
我想你要的是ByteOrder in encoding/binary。
ByteOrder 指定如何将字节序列转换为 16、32 或 64 位无符号整数。
【讨论】: