![How to Convert []byte to uint16 in Go](https://img.php.cn/upload/article/001/246/273/178323068637096.jpg)
在 go 中,可使用 encoding/binary 包将长度为 2 的字节切片([]byte)按指定字节序(大端或小端)安全、高效地转换为 uint16 类型。
在 go 中,可使用 encoding/binary 包将长度为 2 的字节切片([]byte)按指定字节序(大端或小端)安全、高效地转换为 uint16 类型。
Go 语言中,[]byte 本身不携带类型语义,因此将两个字节解释为 uint16 需明确字节序(endianness)。常见场景如解析网络协议、二进制文件或硬件通信数据时,十六进制值 0xB01B(即字节序列 []byte{0xB0, 0x1B})对应十进制 45083,这正是大端序(Big Endian)下的 uint16 值——高位字节在前。
✅ 正确做法是使用标准库 encoding/binary 包提供的 Uint16() 方法:
import "encoding/binary"
data := []byte{0xB0, 0x1B} // 长度必须为 2
val := binary.BigEndian.Uint16(data) // → 45083 (uint16)⚠️ 注意事项:
- 输入 []byte 长度必须恰好为 2,否则会 panic(panic: runtime error: index out of range);
- 若原始数据为小端序(如某些 x86 架构或特定设备输出),请改用 binary.LittleEndian.Uint16(data);
- 不建议通过 unsafe 或 reflect 手动内存重解释——既不安全,也违背 Go 的显式设计哲学;
- 对于从 string 或十六进制字符串(如 "B01B")解析的场景,需先调用 hex.DecodeString() 转为 []byte,再进行转换。
? 小结:encoding/binary 是 Go 官方推荐且零依赖的标准方案,兼具安全性、可读性与跨平台一致性。始终根据协议或数据源规范选择正确的字节序,并确保输入切片长度校验(生产环境建议加 len(data) == 2 判断)。


















