其他分享
首页 > 其他分享> > 3.5字节到大整数的打包与解包

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