簡體   English   中英

python將原始二進制數據轉換為浮點數數組

[英]python convert raw binary data to array of floats

我是 python 的新手,但我需要在其中完成這個項目。 我正在使用 telnetlib 從設備獲取一些原始數據,這就是數據的樣子(這只是我得到的輸出的一部分,真實的大約大 10 倍)

\\xc2\\xb2\\xdd\\x0f\\xc2\\xb2x/\\xc2\\xb2\\x08\\xb2M\\xcf\\xc2\\xb2\\xc5S\\xc2\\xb2\\xd6[\\xc2\\xb2qw\\xc2\\xb1\\xafK\\xn \\xc2\\xb2?\\x83\\xc2\\xb1\\xe3\\xb7\\xc2\\xb0\\xe8\\x87\\xc2\\xb0\\xf1\\x8f\\xc2\\xb1x\\xbf\\xc2\\xb1\\xcbO\\xc2\\xb1\\x x93\\xc2\\xb1\\xd4\\xc3\\xc2\\xb1\\xf7\\x9f\\xc2\\xb1\\xb3\\x97\\xc2\\xb1\\xe7;\\xc2\\xb2\\x97\\xcb\\xc2\\xb2\\xd3\\xf3\\xd3\\xf3 \\xb2f\\x8b\\xc2\\xb1\\xc6\\xdb\\xc2\\xb1\\xadC\\xc2\\xb1t\\xcf\\xc2\\xb1\\x9c\\xdf\\xc2\\xb1\\xb7\\x1b\\xc2\\xb1\\xa3\\xc2\\xa3\\xc2\\ \\t_\\xc2\\xb1v\\xc3\\xc2\\xb1\\xeb

該設備的文檔說這是

原始數據:二進制。 big-endian 格式的浮點值數組(不是字符串)。

問題是如何將這些數據轉換為浮點數數組?

代碼:

import telnetlib
tn = telnetlib.Telnet(hostIP)
tn.read_until("connected")
tn.write("getData\r\n")
data = tn.read_until("\r\n")
print data

當我從終端執行這個腳本時,我得到了一些二進制“垃圾”

 ²\\f²▒▒²▒V²▒²▒ ³▒▒³u▒³:v³▒>³;>²W▒²O^²Xf²▒▒±▒▒²P▒²▒j²▒²▒³Pv³▒▒²▒n²:Z²▒±▒F±▒±7▒±@▒±t^±▒▒±▒▒²5:±▒"±▒~±ю±±*±▒°▒▒°{n°a▒°▒:°Q▒°[°cj°0▒¯▒▒¯▒▒r¯ޒ°▒°▒¯▒▒¯a▒¯▒°E▒°▒r°q*¯▒¯▒

如果我從 python shell 做同樣的事情,我會得到 \\xc2\\xb2\\xdd\\x0f\\xc2... 值

您需要事先知道數組中元素的數量,或者以某種方式推斷計數,即通過計算字節數然后除以浮點大小。 然后使用 struct 模塊解壓二進制數據。

if (len(data) % 8) > 0:
    assert "Data length not a multiple of 8"
L = []
for i in range(0, len(data), 8):
    L.append(struct.unpack('>d', data[i:i+8]))

補充@vz0 答案,還有struct.iter_unpack()

根據格式字符串格式從緩沖區緩沖區中迭代解包。 在這里閱讀文檔

所以我們可以毫無困難地進行轉換:

import struct
import numpy as np

# Choose operators from https://docs.python.org/3/library/struct.html#format-strings
Byte_Order = '<' # little-endian
Format_Characters = 'f' # float (4 bytes)

data_format = Byte_Order + Format_Characters

r = np.array(list(struct.iter_unpack(data_format, data)), dtype=float)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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