go - 如何将一系列 uint16 转换为 float32?
问题描述
我有一个[66 106 179 86]
由 modbus 库(转换代码)生成的序列(这些数字是 modbus 中的两个 16 位寄存器),现在如何将这个序列转换为 32 浮点数?
我试过[]uint32{66,106, 179, 86}
作为参数Float32frombits
但不接受 uint32 列表。
解决方案
使用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
值,则首选此解决方案。
推荐阅读
- c# - 拦截 SqlServerMigrationsSqlGenerator 以防止某些表的迁移?
- c# - 如何确定 String.Split() 中使用的字符
- c# - cshtml中的多对多关系没有获取数据
- python - 元组的问题
- arrays - 引用单元格数据作为工作表名称源的一部分的 Google 工作表查询
- keep-alive - WireMock 保持活动状态
- objective-c - 如何使用 Objective-C 以编程方式将角半径添加到搜索栏?
- curl - curl --doh-url 是否不接受 dns 服务器的 IP 地址,并且响应只是 html?
- javascript - Angular - TypeError:无法读取未定义的属性“0”
- tensorflow - 自定义卷积层的梯度是无的