python - 如何将 27 个字节的数组(其中每 3 个字节是一个 2 的补码)转换成它的等效数字?

标签 python bit-manipulation twos-complement

我想解压一个数据包,里面有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/

相关文章:

python - Pandas 计算每列中小于 x 的元素数

python - 亚马逊 MWS Boto get_matching_product_for_id

python - TF超薄: Fine Tune mobilenet v2 on custom dataset

python-3.x - python3 : How to get logical complement (negation) of a binary number, 例如。 '010' => '101' ?

c++ - 具有不同比例因子的定点数 4 字节或 8 字节 - 转换数字的库?

python - 做self.something = something的目的是什么

c - 使用位域作为 c 中整数的表示

c - C中负数的表示?

c - Unsigned/Signed Arthmetic Problems from A Programmer's Perspective 教科书

字符到 C 中的 2 的补码