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

时间:2016-06-30 09:01:23

标签: python arrays binary floating-point

我是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 \ 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

该设备的文档说明这是

  

原始数据:二进制。 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 ...值

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

补充@ vz0答案,还有struct.iter_unpack()表示:

根据格式字符串格式迭代地从缓冲区缓冲区中解包。 read the docs here

因此我们可以轻松进行转换:

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)