簡體   English   中英

在 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 模塊文檔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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM