我有一些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方式做,我怎么能实现这一点。请帮我解决问题。在此先感谢您的帮助。
答案 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_bytes
和int.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位的整数中 - 为什么不只是一个字节序列: