首页 > 解决方案 > 在 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

是否可以一次解码整个数组,或者我应该在一个循环中分别解码每个浮点数?

标签: pythonbinarydecode

解决方案


使用结构

根据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]

推荐阅读