【问题标题】:python convert raw binary data to array of floatspython将原始二进制数据转换为浮点数组
【发布时间】:2016-11-02 06:33:57
【问题描述】:

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

设备的文档说这是

原始数据:二进制。大端格式的浮点值数组(不是字符串)。

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

代码:

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.unpack 应该能够将二进制数据转换为值元组。 numpy 可能也有办法做到这一点。
  • 你能把你的代码贴在这里吗?也许你需要使用 numpy 或 pandas 来做。
  • @Blckknght 我不知道我得到的花车数量。当我尝试 struct.unpack('d',data) 我得到 struct.error: unpack requires a string argument of length 8

标签: python arrays binary floating-point


【解决方案1】:

补充@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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是我得到的: Traceback(最近一次调用最后一次):文件“./telnet.py”,第 27 行,在 if (data % 8) > 0: ValueError: unsupported索引 283 处的格式字符 '▒' (0xfffffff2)
    • 我很确定应该是len(data) % 8
    猜你喜欢
    • 1970-01-01
    • 2014-11-24
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2021-07-30
    • 2018-10-17
    相关资源
    最近更新 更多