我希望代码返回TPLIG0
作为10亿的base32十六进制扩展值(1.000.000.000),但我得到的是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
。但是这里是怎么回事??
我在Windows上使用python 3.10.7
,在Ubuntu上使用3.11.0
(两者都创建相同的输出)。
2条答案
按热度按时间brgchamk1#
num.bit_length() + 7) // 8
是4,而不是5。如果不是40位(5字节)的倍数,则b32hexencode
用=
填充其结果,并且这些位被移位。使用
(num.bit_length() + 39) // 40 * 5
以5字节的倍数计算needed_bytes
,然后去掉前导零以正确使用base64.b32hexencode()
:输出测试OP值,并滚动每个5位二进制值:
mepcadol2#
您实际上是在尝试将十进制基数转换为base32,我认为
base64
不适合这种情况。从一个基数到另一个基数的转换在其他SO答案中已经涉及(例如,参见here),在您的情况下,您可以实现以下函数:
或者,如果您更喜欢使用现有的模块,
numpy
可以处理这种类型的转换:输出: