num.bit_length() + 7) // 8
是4,而不是5.如果不是40位(5字节)的倍数,并且位被移位,则b32hexencode
用=
填充其结果.
>>> base64.b32hexencode (bytes([1,2,3,4]))
b'0410610='
>>> base64.b32hexencode (bytes([1,2,3,4,5]))
b'04106105'
使用(num.bit_length() + 39) // 40 * 5
以5字节的倍数计算needed_bytes
,然后go 掉前导零以正确使用base64.b32hexencode()
:
import base64
num = 1_000_000_000
def convert(n):
if n == 0: # b32hexencode() return '=====' for zero, so special handling
return '0'
num_bytes = (n.bit_length() + 39) // 40 * 5
needed_bytes = n.to_bytes(num_bytes, byteorder='big')
result = base64.b32hexencode(needed_bytes).lstrip(b'0')
return result.decode() # bytes -> str
def display(n):
result = convert(n)
verify = int(result, 32)
print(f'{result:>9} {verify:17,}')
display(num)
for i in range(9):
n = 2**(i * 5)
display(n - 1)
display(n)
输出测试操作值并滚动每5位二进制值:
TPLIG0 1,000,000,000
0 0
1 1
V 31
10 32
VV 1,023
100 1,024
VVV 32,767
1000 32,768
VVVV 1,048,575
10000 1,048,576
VVVVV 33,554,431
100000 33,554,432
VVVVVV 1,073,741,823
1000000 1,073,741,824
VVVVVVV 34,359,738,367
10000000 34,359,738,368
VVVVVVVV 1,099,511,627,775
100000000 1,099,511,627,776