我正在读取来自python-can的一系列CAN BUS帧,表示为十六进制字符串,例如'9819961F9FFF7FC1'我知道每个帧中的值如下所示:
Signal Startbit Length
A 0 8
B 8 4
C 12 4
D 16 12
E 28 12
F 40 16
G 56 4
每个值都是无符号整数,字节顺序很少。我正在努力的是如何处理12位信号,以及如何快速执行它,因为它将实时运行。据我所知,struct.unpack只支持1,2,4和8字节整数。当您指定字节序时,Bitstring包也仅支持全字节位串。
我显然不能很好地理解二进制文件,因为我一直在试图获得合理的价值,因为我一直在试图获取合理的价值......
答案 0 :(得分:0)
我能够使用bitstruct库成功地并且合理地快速解码帧,该库可以处理任意位数的值,如下面的代码所示。
但是我发现如果同一个字节上存在两个信号,我也必须交换十六进制字符的位置,如CAN frame layout中所示。我仍然不确定原因,但确实有效。
swapped_frame = frame[0:2] + frame[3] + frame[2] + frame[4:6] + frame[7] + \
frame[6] + frame[8:]
ba = bytearray(swapped_frame.decode('hex'))
A,B,C,D,E,F,G = bitstruct.unpack('<u8u4u4u12u12u16u4', ba)