代码之家  ›  专栏  ›  技术社区  ›  user2128702

自定义解码字节数组

  •  0
  • user2128702  · 技术社区  · 6 年前

    我有一个python代码,它正在读取串行数据。它的格式是:

    e\x00\x01\x01\xff\xff\xff
    

    实际上应该存储在这里的是 身份证件 在我通过串行访问的硬件设备上选择的特定组件的。的类型 身份证件 我相信是整数,因为它是自动生成的,我不能改变它,它得到像1,2,3等值。。。对于每个组件(按钮)。

    我的序列号配置如下:

    ser = serial.Serial(port='/dev/serial0',baudrate=9600,timeout=1.0)
    

    如果我点击了一个id为 1 我会得到=> 电子邮件\x00 \x01 \x01\xff\xff\xff

    如果我点击了一个id为的按钮 2 => 电子邮件\x00 \x02

    如果身份证是 10 => 电子邮件\x00 \x0A \x01\xff\xff\xff

    \xff\xff\xff 总是有开始的时候 e .

    我怎样才能以一致的方式读取这些输入,并从整个数组中提取出对我有价值的这一位呢? 从我在网上看到的,我可以用Python的 struct 把这样的东西打包拆开( e\x00\x01\x01\xff\xff\xff

    我想能够读取的是 .

    4 回复  |  直到 6 年前
        1
  •  0
  •   martineau Nae    5 年前

    我认为@parasit的想法是正确的,但我会将事情形式化一些,并使用类似于下面的代码。首字母 x format character struct DAT_FMT 表示忽略数据的第一个字节( e 在示例串行数据中)。

    from __future__ import print_function
    import struct
    
    DAT_FMT = 'x6B'
    
    for sample in (b'e\x00\x01\x01\xff\xff\xff',
                   b'e\x00\x01\x02\xff\xff\xff',
                   b'e\x00\x01\x0a\xff\xff\xff'):
    
        dat0, dat1, id, dat3, dat4, dat5 = struct.unpack(DAT_FMT, sample)
        print(dat0, dat1, id, dat3, dat4, dat5, sep=', ')
    

    0, 1, 1, 255, 255, 255
    0, 1, 2, 255, 255, 255
    0, 1, 10, 255, 255, 255
    
        2
  •  0
  •   parasit    6 年前

    from struct import *
    unpack('xbbbbbb','e\x00\x01\x01\xff\xff\xff')
    (0, 1, 1, -1, -1, -1)
    
        3
  •  0
  •   Joe    6 年前

    e\x00\x01\x01\xff\xff\xff bytes b 当你初始化它的时候。你不需要 struct 去访问它。

    只需使用数组中的索引访问单个字符:

    x = b'e\x00\x01\x01\xff\xff\xff'
    print(x[0]) # this is the 'e', it's 101 in ascii
    print(x[1])
    print(x[2]) # this is the value of your button
    print(x[3]) 
    print(x[4]) 
    
    x = b'e\x00\x0A\x01\xff\xff\xff'
    print(x[2]) # now the value of the button is 10
    
        4
  •  0
  •   John    6 年前

    如果它被表示为一个字符串,或者您可以很容易地将它转换为一个字符串,只需将它拆分为“\”字符并访问[1]和[2]索引即可获得它们。

    s = r"e\x00\x01\x01\xff\xff\xff".split(r"\x") # r prefixed the string to avoid having to escape the backslashes
    int1 = int(s[1], 16) # the second argument is the base, here, hexadecimal
    int2 = int(s[2], 16)
    print(int1) # 2
    print(int2) # 1
    

    print(s[1])
    print(s[2])
    

    获取所需的值