在 Python 3 中将字节数组转换为浮点数组
Convert byte array to float array in 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 documentation the struct.unpack()
function must have defined exact format for unpacking multiple values at once. So if you need to use struct
module, then you either have to define the format using format as '<ff'
or iterate over the array using struct.iter_unpack(format, buffer).
使用数组
另一种选择是使用array module, which allows you to decode the binary data at once. You can change endianness using 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]
Python 的 strcut 提供了一些基本工具,但使用起来有点笨拙。
特别是,为此,它必须将所有浮点数作为 Python 浮点数的元组(它们是“巨大的”objetcs,每个有 10 个字节),然后插入到数组中。
幸运的是,Python 的 array.array
class 本身可以在给定字节对象的情况下填充其值,甚至可以直接从文件中读取。
import array
data = b'\x00\x00\x80?\x00\x00\x00@'
arr = array.array('f')
arr.frombytes(data)
print(arr)
产量:
array('f', [1.0, 2.0])
(直接从文件读取,使用fromfile
方法)
我将 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 documentation the struct.unpack()
function must have defined exact format for unpacking multiple values at once. So if you need to use struct
module, then you either have to define the format using format as '<ff'
or iterate over the array using struct.iter_unpack(format, buffer).
使用数组
另一种选择是使用array module, which allows you to decode the binary data at once. You can change endianness using 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]
Python 的 strcut 提供了一些基本工具,但使用起来有点笨拙。 特别是,为此,它必须将所有浮点数作为 Python 浮点数的元组(它们是“巨大的”objetcs,每个有 10 个字节),然后插入到数组中。
幸运的是,Python 的 array.array
class 本身可以在给定字节对象的情况下填充其值,甚至可以直接从文件中读取。
import array
data = b'\x00\x00\x80?\x00\x00\x00@'
arr = array.array('f')
arr.frombytes(data)
print(arr)
产量:
array('f', [1.0, 2.0])
(直接从文件读取,使用fromfile
方法)