我预计代码将返回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)

我已经try 了b32hexencodeb32encode以及byteorder='little'byteorder='big',但我无法重现预期的结果.

如果我用硬编码的数字num.to_bytes(5, byteorder='big') I can get the approximate result: 00TPLIG0代替除法.但这到底是怎么回事?

我用的是python 3.10.7美元.Windows上的和Ubuntu上的3.11.0(两者都创建相同的输出).

推荐答案

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

Python-3.x相关问答推荐

Pandas—在特定列上比较两行双框,并根据特定条件保留其中一行?

Numpy将3D数组的每个切片相乘以进行转置并对其求和

While循环不停止地等待,直到时间.睡眠结束

类变量的Python子类被视为类方法

合并两个数据帧并对某些总和进行求和

错误:无法为 pyconcorde 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

继承自 Counter 与 dict 的类实例的 Deepcopy

如何统计一个值连续出现的次数?

如何通过 GitLab V4 api 列出 gitlab 项目中的所有项目变量

python 3.10.5 中可能存在的错误. id 函数工作不明确

有没有办法使用 python opencv 计算与图像的白色距离

Dask 多阶段资源设置导致 Failed to Serialize 错误

聚合(aggregate)为最多包含两个元素的列表

使用一周的特定第一天将每日日期转换为每周

获取比较多列的最大值并返回特定值

如何获得 BeautifulSoup 标签的所有直接子代?

在 Ubuntu 上为 Python3 安装 mod_wsgi

命名参数可以与 Python 枚举一起使用吗?

如何为 anaconda python3 安装 gi 模块?

调用 Python doctest 时如何启用省略号?