解构python bytearray的简单/优雅方式?

时间:2015-08-06 03:25:08

标签: python parsing bytearray

我有一个连接到CANbus的设备,我正在接收一系列字节数组,我试图在python中处理它。我想知道将bytearray解构为它的组成部分的最佳(最简单/最优雅)方法是什么。目前,我只使用一个具有与各个部分对应的多个变量的类,并在该类的构造函数中手动加载每个元素。我能够在线找到this,但这只涉及"标准"打包(2的权力),而在这里我有一些奇数的字段。代码如下:

Struct(C ++):

 struct struct_name {
  unsigned CloseLoopErrH:8;
  unsigned CloseLoopErrM:8;
  unsigned CloseLoopErrL:8;
  unsigned AppliedThrottle_h3:3;
  unsigned Fault_RevSoftLim:1;
  // ...
};

Python(使用python-can通过CAN获取消息):

class Parser(object):
    CloseLoopErrH = 0
    CloseLoopErrM = 0
    CloseLoopErrL = 0
    AppliedThrottle_h3 = 0
    Fault_RevSoftLim = 0
    Fault_ForSoftLim = 0
    # ...

    def __init__(self, msg):
        self.CloseLoopErrH = msg.data[0]
        self.CloseLoopErrM = msg.data[1]
        self.CloseLoopErrL = msg.data[2]
        self.AppliedThrottle_h3 = (msg.data[3] & 0xE0) >> 5
        self.Fault_RevSoftLim = (msg.data[3] & 0x10) >> 4
        self.Fault_ForSoftLim = (msg.data[3] & 0x08) >> 3
        # ...

    def __str__(self):
        return """\
CloseLoopErrH: %d, CloseLoopErrM: %d, CloseLoopErrL: %d,
AppliedThrottle_h3: %d, Fault_RevSoftLim: %d, Fault_ForSoftLim: %d,
""" % (self.CloseLoopErrH, self.CloseLoopErrM, self.CloseLoopErrL,
       self.AppliedThrottle_h3, self.Fault_RevSoftLim, self.Fault_ForSoftLim)

def main():
    bus = can.interface.Bus()
    for msg in bus:
        print Parser(msg.data)
main()

1 个答案:

答案 0 :(得分:0)

首先将变量设置为空,然后调用unpack

更多文档here

我们可以做角色:

>>> pack('5c', 'h', 'e', 'l', 'l', 'o')
'hello'
>>> unpack('5c', 'hello')
('h', 'e', 'l', 'l', 'o')

或组合:

>>> pack('ic', 0x12131415, '*')
'\x15\x14\x13\x12*'
>>> unpack('ic', '\x15\x14\x13\x12*')
(303240213, '*')

所有格式都在文档中。