python - 在 Python 3 中将字节数组转换为浮点数组
问题描述
我将 1.0 和 2.0 作为二进制从 C 程序发送到 STDOUT:
float array[2] = { 1.0, 2.0 };
fwrite(&array[0], sizeof(array[0]), sizeof(array) / sizeof(array[0]), stdout);
fflush(stdout);
Python 程序将 STDOUT 读取为:
b'\x00\x00\x80?\x00\x00\x00@'
当我尝试将其转换回浮动时,这有效:
struct.unpack('<f', array[0:4]) # 1.0
struct.unpack('<f', array[4:8]) # 2.0
但是,如果我尝试一次解码整个数组,它会失败:
struct.unpack('<f', array)
带有以下消息:
error: unpack requires a buffer of 4 bytes
是否可以一次解码整个数组,或者我应该在一个循环中分别解码每个浮点数?
解决方案
使用结构
根据struct module 文档,该struct.unpack()
函数必须已经定义了一次解包多个值的确切格式。因此,如果您需要使用struct
模块,则必须使用 format as 定义格式或使用struct.iter_unpack(format, buffer)'<ff'
遍历数组。
使用数组
另一种选择是使用数组模块,它允许您一次解码二进制数据。您可以使用array.byteswap()方法更改字节顺序。唯一的限制是整个数组必须具有相同的类型。
import array
arr = array.array('f', b'\x00\x00\x80?\x00\x00\x00@')
arr.tolist()
# [1.0, 2.0]
# change endianness
arr.byteswap()
arr.tolist()
# [4.600602988224807e-41, 8.96831017167883e-44]
推荐阅读
- html - 将条件放入 Thymeleaf,取决于其值类型
- linux - 如何使用 cronolog 或 rotatelogs 轮换 ProFTPd 中的日志
- java - 使用基于 Java EE 8 的 NetBeans 创建 Maven Webapp
- php - 如何在php中找到0是否为整数
- jolokia - 如何在同一主机上同时将 Jolokia 用于多个进程?
- http - 允许客户端选择 JWT 算法的 HTTP 标头
- angular - 使用 TypeScript 在 ionic 3 中解析 XML 中的问题
- ios - iOS - [WKWebView .cxx_construct] 只能在主线程中使用
- python - Memoryview 的规范 - Cython
- istio - 将 istio 与 aad-pod-identity 一起使用