在Python中输入128位的32位后分别拆分

Split each after 32 bits of 128 bit input in Python

我正在尝试在 Python 中进行 128 位操作,以便在 32 位之后拆分 128 位

var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF # var may take any value from 0x0 to  0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

我试过了

n = 8 # for 32 bit splitting
[var[i:i+n] for i in range(0, len(var), n)]

但是没有内置的长度运算符来查找 long 变量的长度。我研究了 bitarray 模块,我不想在我的代码中使用位数组,有没有 pythonic 方式的东西?

预期输出为 [0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF, 0xFFFFFFFF]

您可以使用移位 (>>) 和按位与 (&):

In [10]: [(i >> x) & 0xFFFFFFFF for x in reversed(range(0, 128, 32))]
Out[10]: [4294967295, 4294967295, 4294967295, 4294967295]

其中 i 是您的整数。结果列表将有 4 个元素(因为 128 / 324)。

在你的情况下,结果是 4 个相等的数字(4294967295,因为 42949672950xFFFFFFFF 十六进制)。

这适用于已知位数 (32),但我宁愿使用辅助函数(遵循与上述相同的逻辑):

def split_bits(value, n):
    ''' Split `value` into a list of `n`-bit integers '''
    mask, parts = (1 << n) - 1, []
    parts = []
    while value:
        parts.append(value & mask)
        value >>= n
    parts.reverse()
    return parts

进行中:

In [14]: split_bits(0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 32)
Out[14]: [4294967295, 4294967295, 4294967295, 4294967295]

In [15]: [format(i, 'X') for i in _] # show corresponding hex representations
Out[15]: ['FFFFFFFF', 'FFFFFFFF', 'FFFFFFFF', 'FFFFFFFF']

In [16]: split_bits(0b1000100110101011, 4)
Out[16]: [8, 9, 10, 11]

In [17]: [format(i, 'b') for i in _] # show corresponding binary representations
Out[17]: ['1000', '1001', '1010', '1011']

最好使用数字而不是字符串

var = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[(var & (0xFFFFFFFF << 32*i)) >> (32*i) for i in range(4)]

最终您可以将数字转换为字符串十六进制表示形式

format(n, 'x')