我希望代码返回
TPLIG0
作为 10 亿 (1.000.000.000) 的 base32 十六进制扩展值。相反,我得到7EDCK00=
.
这是我的代码:
import base64
num = 1000000000
needed_bytes = num.to_bytes((num.bit_length() + 7) // 8, byteorder='big')
result = base64.b32hexencode(needed_bytes).decode('utf-8')
print(result)
我试过
b32hexencode
,b32encode
,以及byteorder='little'
和byteorder='big'
,但我无法重现预期的结果。
如果我用硬编码数字替换除法:
num.to_bytes(5, byteorder='big')
我可以得到近似结果:00TPLIG0
。但是这里发生了什么??
我正在使用
python 3.10.7
。在 Windows 上和 3.11.0
在 Ubuntu 上(两者都创建相同的输出)。
您实际上是在尝试将十进制基数转换为 base32。我不认为
base64
是为这样的用例而设计的。
从一个基地转换到另一个基地已经包含在其他 SO 答案中(例如参见here)。在您的情况下,您可以实现以下功能:
def base10to32(n,symbols="0123456789ABCDEFGHIJKLMNOPQRSTUV"):
return (base10to32(n//32)+symbols[n%32]).lstrip("0") if n>0 else "0"
base10to32(1000000000)
或者如果您更喜欢使用现有模块,
numpy
可以处理这种类型的转换:
import numpy as np
np.base_repr(1000000000, 32)
输出:
TPLIG0