在python中将原始二进制数据转换为自定义基的最佳方法是什么?

2024-04-19 14:23:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在处理之前,我需要将一些数据转换为29进制,我使用的是:

import string

def datatobase(data, base):
    digs = string.digits + string.lowercase + string.uppercase
    if base > len(digs):
        return None
    digits = []
    x = int(data.encode("hex"), 16)
    while x:
        digits.append(digs[x % base])
        x /= base
    digits.reverse()
    return ''.join(digits)

问题是这个小代码太慢了,所以你会怎么做来替换它?在

一个自定义的答案只有29将是伟大的太!在


Tags: 数据importnonedatabasestringlenreturn
3条回答

如果你负责运行时。。。这个版本比你的快2.8倍,比二战时快7%。在

def bin2base29(n):
    s = '0123456789ABCDEFGHIJKLMNOPQRS'
    return s[n] if n < 29 else bin2base29(n / 29) + s[n % 29]

这是我根据@wwii改编的方法的最后一个迭代和最快的解决方案。在

^{pr2}$

如果您不反对使用第三方软件包,numpy.base_repr()是进行转换的一种非常方便的方法:

import os
import numpy

def datatobase(data, base):
    n = int(data.encode('hex'), 16)
    return numpy.base_repr(n, base)

>>> data = os.urandom(32)
>>> data
'\xfcBs\x82\xa8&\x18\xaaK\x8c$\x0fZ\x95\xc0aA%\x93\x91\xcc\x8a\xa8\xfdbk\xeb\x14\x15\x06\xbag'

>>> datatobase(data, 29)
'A8FB42CHLNEIOOE75AG773EKGBA69QP89PANAF8ROH2GA1LF3CC5H'
>>> datatobase(data, 16)
'FC427382A82618AA4B8C240F5A95C06141259391CC8AA8FD626BEB141506BA67'

您需要分析一下这是否为您的应用程序提供了足够的性能。在

更新

分析表明numpy.base_repr()比OP的实现慢。这是因为numpy实现与Python中实现的算法基本相同,只是添加了可选的零填充。在

仅以29为基数,是int参数的解决方案。在

递归的:

s = '0123456789ABCDEFGHIJKLMNOPQRS'
def foo(n, s=s):
    if n < 29:
        return s[n]
    a, b = divmod(n, 29)
    return foo(a) + s[b]

常规

^{pr2}$

相关问题 更多 >