Python number dig2

来源:互联网 发布:怎么搜淘宝衣服好看 编辑:程序博客网 时间:2024/06/03 17:20

1.从字节串中打包和解包大整数

1.1 假设存在一个字节串,我们需要将其解包为一个整型数值

data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'

要将字节解释为整数,我们可以使用int.from_bytes()方法
这里写图片描述
1.2 如果需要将一个大整数转换为一个字节串

num = 69120565665751139577663547927094891008

要将大整数转换为字符串,我们可以使用int.to_bytes()方法,只需要指定字节数以及字节序即可
这里写图片描述
大整数和字节串的相互转换并不是常见的操作,但是在特定领域中,比如加密技术或者网络应用中会用到,比如ipv6网络地址的操作。

1.3 作为此话题的替代方案,接下来将介绍使用struct模块来完成解包,但是我们得知道struct模块可解包的整数大小是有限制的,所以需要解包多个值然后合并解包结果得到最终的结果。
这里写图片描述
由上图可知,如果我们尝试将一个整数打包成字节串但是字节大小指定不合适的话就会得到错误信息,所以对于不知道字节大小的未转换整数我们将使用int.bit_length()方法先确定需要多少位来保存这个转换结果然后再进行转换

import structdata=b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'num = 532**23hi,lo = struct.unpack('>QQ', data)print((hi << 64) + lo)len=num.bit_length()nbytes,rem = divmod(len, 8)if rem:    nbytes += 1print(num.to_bytes( nbytes,'little'))

这里写图片描述
1.4 字节序的规范(大端或者小端)

大端或者小端指定了组成整数的字节是从低位到高位排列还是从高位到低位排列,下面我们构造一个十六进制数来演示一下:

这里写图片描述
由操作结果我们可以看出大小端排列的差别

原创粉丝点击