如何将整数列表连接成一个整数python

Aka*_*rma 4 python byte integer join list

给定一个十六进制整数列表,我想得到一个十六进制整数,其中整数被视为最重要的第一个和最不重要的最后一个.

例如,给定... [0x1A,0xF3,0​​x74,0xA3]

...我想以0x1AF374A3结束

在我熟悉的另一种编程语言中,这是一个相当简单的操作,称为"join",但显然"join"在Python中意味着其他东西.

我知道我可以遍历列表,将每个后续元素乘以2 ^并添加它们.我也知道我可以将元素转换为字符串,连接它们然后转换回整数.但这两种方法看起来都很笨拙.似乎应该有一个更简单/更优雅的方式.在那儿?

在此先感谢您的帮助!

Lau*_* H. 5

我建议你将值切换为字节类型以便连接它们,它们切换回int类型,如下所示:

myList = [0x1A, 0xF3, 0x74, 0xA3]
# Conversion to 'bytes'
a = bytes()
for b in myList:
    a += b.to_bytes(1,'big')
# Conversion back to 'int'
a = int.from_bytes(a, 'big')
print(hex(a))  # 0x1af374a3
Run Code Online (Sandbox Code Playgroud)

并且您可以使用作为参数传递给join()方法的生成器理解来替换经典for循环,以便连接字节项.它仍然可读,有点短,如下:

myList = [0x1A, 0xF3, 0x74, 0xA3]
a = b''.join(b.to_bytes(1,'big') for b in myList) # Conversion to 'bytes'
a = int.from_bytes(a, 'big')                      # Conversion back to 'int'
print(hex(a))  # 0x1af374a3
Run Code Online (Sandbox Code Playgroud)

请注意,如果在输入列表中的整数超过了255,那么你在逻辑上出现错误OverflowError: int too big to convert,由于b.to_bytes(1,'big').当然,如果发生这种情况,可以通过管理异常来改进它.

我最后也可能建议你使用乘法256乘法的解决方案,只是为了告诉你它只能在一行中实现:

myList = [0x1A, 0xF3, 0x74, 0xA3]
a = sum(nb*(256**i) for i,nb in enumerate(reversed(myList)))
print(hex(a))  # 0x1af374a3
Run Code Online (Sandbox Code Playgroud)


duy*_*yue 0

from functools import reduce
reduce(lambda x, y: x<<8 | y, [0x1A, 0xF3, 0x74, 0xA3])
# 452162723
'0x{:X}'.format(452162723)
# '0x1AF374A3'
Run Code Online (Sandbox Code Playgroud)

相反:

>>> [0x1AF374A3 >> i & 0xff for i in reversed(range(0, 32, 8))]
[26, 243, 116, 163]
>>> [hex(0x1AF374A3 >> i & 0xff) for i in reversed(range(0, 32, 8))]
['0x1a', '0xf3', '0x74', '0xa3']
Run Code Online (Sandbox Code Playgroud)