如何在Python中解码字节数组

时间:2018-09-21 16:26:38

标签: python arrays serial-port

嘿,我多次与公司联系,经过一段怪异的交谈后,我得到了一些代码,可以读取和解码数据。谢谢大家的帮助!

我将PCB连接到我的Raspberry PI,它应该输出温度,湿度,压力和空气质量。我通过串行接收数据。我编写了一个Python脚本,该脚本读取序列并输出数据。

<ol>

数据看起来像这样(多个样本数据):

#!/usr/bin/env python
import time
import serial

ser = serial.Serial(
        port='/dev/ttyAMA0',
        baudrate = 9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=1
)

while 1:
        x=ser.readline()
        print (x)

因此应该是多个字节数组。遗憾的是,没有文档,因此我找不到如何解码的任何内容。如果我尝试解码数据:

b'ZZ?\x0f\t,\x16a\x01\x86\x8d\x10Y\x00\x02\xa5\x9b\x00p\xdd'

b'ZZ?\x0f\t.\x16]\x01\x86\x8f\x10Z\x00\x02\xa3\x7f\x00p\xc0'

b'ZZ?\x0f\t0\x16[\x01\x86\x91\x10Y\x00\x02\xa2\xcc\x00p\r'

b'ZZ?\x0f\t2\x16S\x01\x86\x91\x10V\x00\x02\xa4\xe7\x00p!'

b'ZZ?\x0f\t3\x16O\x01\x86\x8f\x10X\x00\x02\xa3\x7f\x00p\xb5'

我收到以下错误:

x=ser.readline().decode()

那么也许数据不是utf-8?忽略错误没有帮助。有人知道如何正确解码数据吗?那对我有很大帮助!

谢谢!

2 个答案:

答案 0 :(得分:0)

这看起来像原始的二进制数据(在我尝试过的任何常见编码中,人类都不可读)。您需要查找字节的结构,并可能使用struct库将其转换为常规python对象。

如果没有文档,则必须对其进行反向工程。每个字节数组长20个字节,并且前四个字节都相同,因此我的直觉假设是前四个字节(32位)是标头,后跟四个值(32位浮点数或整数)。如果是这样的话,您可以使用以下内容解码每个数组:

var weekSpan = [1, 2, 3, 4, 5];
var weekDay = 5;
if (weekSpan.includes(weekDay)) {
  console.log("Woooohhh!");
}

您提供的示例表明,所有4个字节数字的简单情况可能并非如此(这些数字都不适合天气读数),但可能是各种长度数字的混合,以说明各种传感器具有不同的精度水平。

答案 1 :(得分:0)

我多次与公司联系,经过一段怪异的交谈,我得到了一些代码,可以读取和解码数据。谢谢大家的帮助!