三个32位整数在python 2.7中打包成80位二进制数

时间:2015-08-26 12:23:04

标签: python

我有一些80位操作的问题,这很容易理解。 但我错过了基本的东西。这些我的代码片段

def get32bitNumber():

temp1 = 0b10101010101010101010101010101010101010101010101010101010101010101010101010101010   # 80 bits inputs
        ''' Split `value` into a list of `3`-bit integers '''
        mask, temp2= (1 << 32) - 1, []
        temp2= []
        while temp1:
            temp2.append(temp1& mask)
            temp1>>= 32
        return temp

if __name__ == "__main__":   

      aList = []
      aList =get32bitNumber()             

预期产出:

aList = [0x0000AAAA,0xAAAAAAAA,0xAAAAAAAA] # i want convert aList into expected_output 
expected_output = 0xAAAAAAAAAAAAAAAAAAAA # output would be in binary only 0b10101010101010101010101010101010101010101010101010101010101010101010101010101010

这里的问题是列表包含3 - 32位数,它导致96位,例如[32bitNumber1,32bitNumber2,32bitNumber3]。我只想要80位作为长值的bin。我研究过,我得到了一个阵列,但是我不想在比特数组中使用它,我想用pythonic方式做,我怎么能实现这一点。请帮我解决问题。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

正如凯文所说,对于任何3个32位的整数,你要做的事情是不可能的。如果最左边的16位二进制数字将始终为0,那么expected_output将为number1 * 2 ^ 64 + number2 * 2 ^ 32 + number3。为了使它切断数字1的前16位,所以输出保证适合80位,你需要将上面的答案修改为2 ^ 80。

for i, value in enumerate(list_of_inputs[::-1]): output+=value*(2**(32*i)) output=output%(2**80) 第一行向后遍历数组的元素以及它们的索引(它们在数组中的位置)。向后经历的原因是第3个元素是你想要的最小元素。然后它将输出设置为移位到位的值。最后一行摆脱了前16位,因此剩下80位。

答案 1 :(得分:0)

在python&gt; = 3.2中,您可以使用int.from_bytesint.to_bytes

format = struct.Struct('<IIH')

a_32 = 0xAAAAAAAA
b_32 = 0xAAAAAAAA
c_16 = 0xAAAA

# pack the values into a `bytes` object
packed_bytes = format.pack(a_32, b_32, c_16)

if "we need to actually convert to an integer":
    # convert the bytes into a single integer
    packed_int = int.from_bytes(packet_bytes, byteorder='little')

    # now convert back to bytes
    res_packed_bytes = packed_int.to_bytes(byteorder='little')
else:
    res_packed_bytes = packed_bytes

# and unpack those bytes back to the values
a, b, c = format.unpack(res_packed_bytes)

但是,我首先要查询为什么你需要把它放到一个80位的整数中 - 为什么不只是一个字节序列: