我有一个连接到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()
答案 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, '*')
所有格式都在文档中。