1. 程式人生 > 其它 >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'