[英]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 模塊文檔, struct.unpack()
函數必須定義了一次解包多個值的確切格式。 因此,如果您需要使用struct
模塊,那么您必須使用 format 定義格式為'<ff'
或使用struct.iter_unpack(format, buffer)迭代數組。
另一種選擇是使用數組模塊,它允許您一次解碼二進制數據。 您可以使用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
類本身可以填充給定字節對象的值,甚至可以直接從文件中讀取。
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
方法)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.