Go 中将字节数组转换为有符号整数和浮点数
在 Go 中,二进制包提供了从 []byte 转换无符号整数的函数数组,例如binary.LittleEndian.Uint16()和binary.BigEndian.Uint32()。然而,有符号整数或浮点数没有直接等价物。
缺少有符号整数转换函数的原因
缺少有符号整数转换函数的主要原因是事实上,将二进制表示解释为有符号或无符号值是编程逻辑的问题。 []byte 数组本身仅包含原始二进制数据,可以根据应用程序的要求将其解释为有符号或无符号。
如何转换为有符号整数
要将无符号整数值转换为有符号整数,可以使用简单的类型转换。由于相同大小的无符号和有符号整数的内存布局相同,因此使用 int16(a) 将 a 从 uint16 转换为 int16 将保留原始二进制表示形式,同时分配适当的符号。
转换为浮点数
从无符号整数转换为浮点数需要更多的参与。 math 包提供了用于此目的的函数:math.Float32frombits() 和 math.Float64frombits()。相反,math.Float32bits() 和 math.Float64bits() 可用于获取浮点值的无符号整数表示形式。
使用 Binary.Read() 和 Binary.Write()
二进制包还包括 Read() 和 Write() 函数,它们可以在后台更有效地执行这些转换。这些函数允许您直接读取类型值,而无需中间类型转换。
使用 Binary.Read() 进行浮点转换的示例
考虑以下内容例如:
b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
var pi float64
buf := bytes.NewReader(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println("binary.Read failed:", err)
}
fmt.Println(pi) // Output: 3.141592653589793
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3