ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3.5字节到大整数的打包与解包

2022-03-05 14:01:10  阅读:181  来源: 互联网

标签:little 字节 16 bytes 解包 3.5 整数 print


问题

​ 你有一个字节字符串并想它解压成一个整数。或者,急需要将又给大整数转换为一个字节字符串。

解决方案

​ 假设你的程序需要处理又给拥有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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有