python cookbook 学习笔记 第三章 数字日期和时间(5) 字节到大整数的打包和解包

本文介绍如何使用Python的int.from_bytes()和int.to_bytes()方法进行字节字符串与大整数之间的转换,包括字节顺序的影响及整数大小限制的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 字节到大整数的打包和解包
  • 问题
    • 有一个字节字符串,需要将他解压成一个整数,或者将一个大整数转换为一个字节字符串。
  • 解决方案:
    • 假设需要处理一个128位长的16个元素的字节字符串。比如:
data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
  • 为了将 bytes 解析为整数,使用int.from_bytes() 方法,并像下面这样指定字节顺 序:
print(len(data))  # 16
print(int.from_bytes(data, "little"))
# 69120565665751139577663547927094891008
  • 为了将一个大整数转换为一个字节字符串,使用 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'
  • 讨论: 作为一种提单方案,可以使用 struct 模块来解压字节,不过利用 struct 模块对
  • 整数的大小是有限制的。
data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
import struct
hi, lo = struct.unpack(">QQ",data)
print((hi << 64) + lo)
# 94522842520747284487117727783387188
  • 字节顺序规则(little, big)仅仅指定构建整数时的字节低位和高位排列方式。
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.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' )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值