Python将原始二进制数据转换为浮点数数组



我是新的python,但我需要得到这个项目在它完成。我正在使用telnetlib从设备获取一些原始数据,这就是数据的样子(这只是我得到的输出的一部分,真正的输出大约是10倍大)

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

设备的文档说明这是

原始数据:二进制。一个大端浮点数数组(不是字符串)。

问题是如何将此数据转换为浮点数数组?

代码:

import telnetlib
tn = telnetlib.Telnet(hostIP)
tn.read_until("connected")
tn.write("getDatarn")
data = tn.read_until("rn")
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做同样的事情,我得到xc2xb2xddx0fxc2…值

您需要提前知道数组中元素的数量,或者以某种方式推断计数,即通过计算字节数然后除以浮点数大小。然后使用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():

根据格式字符串format从缓冲区中迭代解包。阅读这里的文档

所以我们可以毫不费力地转换:

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)

最新更新