首页 > 解决方案 > 如何将一系列 uint16 转换为 float32?

问题描述

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

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

标签: gocastingmodbus

解决方案


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


推荐阅读