我想解压一个数据包,里面有9个数字,每个数字都是2的补码格式,占3个字节。因此我的包中有 27 个字节。
我有这个,它允许我将 struct.unpack
与 4 字节数字一起使用,但将我的数字乘以 16。
有效但将输出乘以 16
data = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
a = a[:3] + [0] + a[3:6] + [0] + a[6:9] + [0] + a[9:12] + [0] + a[12:15] + [0] + a[15:18] + a[18:21] + [0] + [0] + a[21:24] + [0] + a[24:27] + [0]
ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8 = struct.unpack('>lllllllll', bytearray(a))
对于 4 个字节的 2 的补码,我必须将 0xFF 添加到负数的前面,将 0x00 添加到正数的前面。
是否有一种聪明的方法来执行此操作?最有效的方法是什么?
最佳答案
您可以使用辅助函数来扩展第三个字节的符号位以生成第四个字节:
import struct
data = [0x00, 0x00, 0x00,
0xff, 0xff, 0xff,
0x00, 0x00, 0x02,
0xff, 0xff, 0xfd,
0x00, 0x00, 0x04,
0xff, 0xff, 0xfb,
0x00, 0x00, 0x06,
0xff, 0xff, 0xf9,
0x00, 0x00, 0x08]
signed = lambda v: [0xff if v & 0x80 else 0x00,]
ch = [struct.unpack('>i', ''.join(map(chr, signed(data[i]) + data[i:i+3])))[0]
for i in range(0, len(data), 3)]
print(ch) # -> [0, -1, 2, -3, 4, -5, 6, -7, 8]
关于python - 如何将 27 个字节的数组(其中每 3 个字节是一个 2 的补码)转换成它的等效数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611170/