我是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 ...值
答案 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)