我有一个由modbus库(conversion code)生成的序列[66 106 179 86]
(这些数字是modbus中的两个16位寄存器),现在我该如何在32个浮点数中转换这个序列?
我已尝试[]uint32{66,106, 179, 86}
作为Float32frombits
的参数,但不接受uint32列表。
答案 0 :(得分:4)
math.Float32fromBits()
我们可以使用math.Float32fromBits()
从其“二进制”表示中获取float32
值。但是为了使用它,我们需要将4字节数据打包成uint32
值。为此,我们可以使用binary.ByteOrder.Uint32()
:
data := []byte{66, 106, 179, 86}
bits := binary.BigEndian.Uint32(data)
f := math.Float32frombits(bits)
fmt.Println(f)
输出(在Go Playground上尝试):
58.675133
如果我们只想读取一个float32
值,此解决方案会更快。
binary.Read()
另一种选择是使用binary.Read()
来填充io.Reader
中的固定大小值。如果我们将数据作为字节切片,我们可以使用bytes.NewBuffer()
从中获取io.Reader
:
data := []byte{66, 106, 179, 86}
var f float32
err := binary.Read(bytes.NewBuffer(data), binary.BigEndian, &f)
fmt.Println(f, err)
输出(在Go Playground上尝试):
58.675133 <nil>
如果我们必须从输入中读取一系列float32
值,则首选此解决方案。