将字节数组从\ xff转换为x0FF

时间:2014-09-10 07:16:35

标签: python python-3.x sensor

我在Python 3中编写代码以从ECG传感器读取数据。最终代码必须将从传感器接收的数据包写入文件。 这是我实际拥有的代码:

import serial


if __name__ == '__main__':
    buffer = [0, 0, 0, 0, 0, 0]
    f = open('dumpECG', 'w')
    print("Hi")
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    while 1 == 1:
        while ser.inWaiting() > 6:
            buf = ser.read()
            if buf > b'\xf7':

                if buf == b'\xfd':
                    1 == 1
                else:
                    buffer[0] = buf
                    if ser.isOpen():
                        buffer[1] = ser.read()
                    if buffer[0] == b'\xf8':
                        temp = (ord(buffer[1]) >> 4) + 2
                        if temp < 11:
                            for i in range(2, int(temp), 1):
                                if ser.isOpen():
                                    buffer[i] = ser.read()
                            print(buffer)
                            data = ''.join(str(e) for e in buffer)
                            data = map(hex, map(ord, data))
                            f.write(''.join(data))
                            f.write("\n")
                    elif buffer[0] == b'\xfe':
                        temp = (ord(buffer[1]) >> 4) + 2
                        if temp < 8:
                            for i in range(2, int(temp), 1):
                                if ser.isOpen():
                                    buffer[i] = ser.read()
                            print(buffer)
                            f.write(''.join(str(e) for e in buffer))
                            f.write("\n")
                    elif buffer[0] == b'\xf9' or buffer[0] == b'\xfa':
                        if ser.isOpen():
                            buffer[2] = ser.read()
                        print(buffer)
                        f.write(''.join(str(e) for e in buffer))
                        f.write("\n")
                    elif buffer[0] == b'\xfc':
                        for i in range(2, int(6), 1):
                            if ser.isOpen():
                                buffer[i] = ser.read()
                        f.write(''.join(str(e) for e in buffer))
                        f.write("\n")

作为示例数据,当到达第一个打印(缓冲区)缓冲区时包含:&#34; [b&#39; \ xf8&#39;,b&#39; 8&#39;,b&#39; \ x80&#39 ;,&#39; \ x80&#39;,b&#39; \ x80&#39;,0]&#34;我必须写入文件&#34; 0xF8,0x38,0x80,0x80,0x80,0和#34; 我试过这样做

data = ''.join(str(e) for e in buffer)
data = map(hex, map(ord, data))

但他会转换所有字符,而不是值。

1 个答案:

答案 0 :(得分:1)

所以你有这个:

"[b'\xf8', b'8', b'\x80', b'\x80', b'\x80', 0]" 

你想要这个:

"0xF8, 0x38, 0x80, 0x80, 0x80, 0"

(我假设你真的想要0x38,而不是0x08,因为b'8'b'\x38',而不是b'\x08'。如果我是错了,你需要解释你的规则...)


首先要注意的是,这显然是由Python的repr生成的输出,因为没有其他任何常见的东西可以给你那些b - 前缀字符串。如果可能的话,更改生成这些字符串的任何代码可能会好得多,以便它只传递列表(如果在Python中)或使用一些标准化,安全,健壮的交换格式,如JSON,而不是只打印出{{ 1}}。但是如果你不能改变它,那么扭转它的方法是repr

ast.literal_eval

接下来,其中一些值是单字节>>> ast.literal_eval(buffer) [b'\xf8', b'8', b'\x80', b'\x80', b'\x80', 0] 对象,有些是数字。看起来您想要单独留下数字,但将字节转换为十六进制数字。因此,我们需要为每种类型做不同的事情。

我们为每种类型做些什么?好吧,对于bytes,我们必须调用bytes(或仅使用ord),然后调用[0],就像您尝试的那样。但是对于hex,我们只需要致电int。所以:

str

现在我们加入他们:

>>> [hex(ord(b)) if isinstance(b, bytes) else str(b) 
...  for b in ast.literal_eval(buffer)]
['0XF8', '0X38', '0X80', '0X80', '0X80', '0']

如果你真的需要字母十六进制数字大写,>>> ', '.join(hex(ord(b)) if isinstance(b, bytes) else str(b) ... for b in ast.literal_eval(buffer)) '0xf8, 0x38, 0x80, 0x80, 0x80, 0' 不能这样做,所以:

hex