作者:祗想抱著伱 | 来源:互联网 | 2022-12-06 18:07
给定一个十六进制整数列表,我想得到一个十六进制整数,其中整数被视为最重要的第一个和最不重要的最后一个.
例如,给定... [0x1A,0xF3,0x74,0xA3]
...我想以0x1AF374A3结束
在我熟悉的另一种编程语言中,这是一个相当简单的操作,称为"join",但显然"join"在Python中意味着其他东西.
我知道我可以遍历列表,将每个后续元素乘以2 ^并添加它们.我也知道我可以将元素转换为字符串,连接它们然后转换回整数.但这两种方法看起来都很笨拙.似乎应该有一个更简单/更优雅的方式.在那儿?
在此先感谢您的帮助!
1> Laurent H...:
我建议你将值切换为字节类型以便连接它们,它们切换回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
并且您可以使用作为参数传递给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
请注意,如果在输入列表中的整数超过了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