python基础第五课--从字符串中打包和解包大整数(小白piao分享)

#4、从字符串打包和解包大整数
#将一个字符串解包成一个大整数,将一个大整数打包成一个字符串
#4.1 解决方案:
#假设程序需要处理一个有16个元素的字节串,其中保存着一个128位的大整数
data = b’\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004’
#要将字节解释为整数,可以使用int.from_bytes(),然后制定字节序即可:
print(int.from_bytes(data,‘little’)) # 69120565665751139577663547927094891008
print(int.from_bytes(data,‘big’)) # 94522842520747284487117727783387188
#将一个大整数转换为字节串可使用int.to_bytes()方法,只需要指定字节数和字节序即可
x = 94522842520747284487117727783387188
print(x.to_bytes(16,‘big’)) # b’\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004’
print(x.to_bytes(16,‘little’)) # b’4\x00#\x00\x01\xef\xcd\x00\xab\x90x\x00V4\x12\x00’
#4.2 讨论:
#如果尝试将一个整数打包成字节串,但字节大小不合适的化就会得到一个错误信息。
#如果需要的话,可以使用int.bit_length()来确定需要用到多少位才能保存这个值
x = 523 ** 23
#x.to_bytes(16,‘little’) # OverflowError: int too big to convert
print(x.bit_length())# bit:208
nbytes,rem = divmod(x.bit_length(),8) # divmod(a,b) 得到a,b的商和余数组成的二元组

if rem: # 一个字节可以存放8bit,如果余数为0则刚好存下,否则扩展一个字节来存剩余位数
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’

发布了17 篇原创文章 · 获赞 1 · 访问量 359

猜你喜欢

转载自blog.csdn.net/weixin_43520503/article/details/104394471