如何将uint16的序列转换为float32?

时间:2018-05-16 07:44:49

标签: go casting modbus

我有一个由modbus库(conversion code)生成的序列[66 106 179 86](这些数字是modbus中的两个16位寄存器),现在我该如何在32个浮点数中转换这个序列?

我已尝试[]uint32{66,106, 179, 86}作为Float32frombits的参数,但不接受uint32列表。

1 个答案:

答案 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值,则首选此解决方案。