3.5字节到大整数的打包与解包
作者:互联网
问题
你有一个字节字符串并想它解压成一个整数。或者,急需要将又给大整数转换为一个字节字符串。
解决方案
假设你的程序需要处理又给拥有128位长的16个元素的字节字符串。比如:
data=b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
print(len(data)) # ->16
print(int.from_bytes(data,'little')) # ->69120565665751139577663547927094891008
print(int.from_bytes(data,'big')) # ->94522842520747284487117727783387188
讨论
大整数和字符字符串之间的转换操作并不常见。然而,在一下应用领域有些时候也会出现,比如密码学或者网络。例如,IPV6网络地址使用一个128位的整数表示。如果你要从一个数据记录中提取这样的值的时候,你就会面对这样的问题。
字节顺序规则(little或者big)仅仅指定了构建整数是2的的字节的地位高位排列方式。我呢下面精心构造的16进制的表示中可以很容易看的出来:
x=0x01020304
print(x.to_bytes(4,'big')) # ->b'\x01\x02\x03\x04'
print(x.to_bytes(4,'little')) # ->b'\x04\x03\x02\x01'
如果你试着将一个整数打包为字节字符串,那么它就不合适了,你会得到一个错误。如果你需要的话,你可以使用int.bit_length()方法来决定需要多少字节位来存储这个值。
x=523**23
print(x) # ->335381300113661875107536852714019056160355655333978849017944067
# print(x.to_bytes(16,'little'))
print(x.bit_length()) # ->208
nbytes,rem=divmod(x.bit_length(),8)
if rem:
nbytes+=1
print(x.to_bytes(nbytes,'little')) #->b'\x03X\xf1\x82iT\x96\xac\xc7c\x16\xf3\xb9\xcf\x18\xee\xec\x91\xd1\x98\xa2\xc8\xd9R\xb5\xd0'
标签:little,字节,16,bytes,解包,3.5,整数,print 来源: https://www.cnblogs.com/ye-peng/p/15967819.html