如何简单优雅地分解Python bytearray?

2024-10-03 06:19:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个连接到CANbus的设备,通过它我接收到一系列bytearray,我正试图用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()

Tags: selfdatadefmsgcanh3faultbytearray
1条回答
网友
1楼 · 发布于 2024-10-03 06:19:02

首先将变量设置为空,然后调用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, '*')

所有格式都在文档中。你知道吗

相关问题 更多 >