Python:整数到 Base 32 hex(又名 Triacontakaidecimal)

Posted

技术标签:

【中文标题】Python:整数到 Base 32 hex(又名 Triacontakaidecimal)【英文标题】:Python: Integer to Base 32 hex (aka. Triacontakaidecimal) 【发布时间】:2011-10-05 06:02:21 【问题描述】:

好的,例如,从 Base 32 hex(又名 Triacontakaidecimal)到整数非常简单:

>>>int("v", 32)
31

但是,您如何反过来呢?如果不存在这样做的方法,我正在考虑设置字典。

编辑:

我实际上是用字典来做这个的,我这个方法的想法是取一个基数为 32 的十六进制字符,如果 LSB 没有设置为 1 则增加它

>>> def incHex(hexChar):
...     intRep = int(hexChar, 32)
...     binRep = bin(intRep)
...     if(binRep[-1:]!='1'):
...         intRep += 1
...     convDict = 0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,10:'A',11:'B',12:'C',
...                 13:'D',14:'E',15:'F',16:'G',17:'H',18:'I',19:'J',20:'K',21:'L',
...                 22:'M',23:'N',24:'O',25:'P',26:'Q',27:'R',28:'S',29:'T',30:'U',
...                 31:'V'
...     return convDict[intRep]
...
>>> incHex('l')
'L'
>>> incHex('m')
'N'
>>>

【问题讨论】:

convert integer to a string in a given numeric base in python 的可能重复项 阅读这里:***.com/questions/209513/… 其实第一个链接可能太远了,第二个链接是个误会,我不想从十六进制转到整数,我想从整数转到以32为底的十六进制。我已经更新了我的 OP,因为它可以工作并且是我想要的。 十六进制是“十六进制”,它是以 16 为基数。只有 16。“以 32 为基数的十六进制”没有任何意义。请修正问题以删除短语“base 32 hex”,因为它没有任何意义。 其实en.wikipedia.org/wiki/Base32#base32hex确实存在,不过叫Triacontakaidecimal 【参考方案1】:

十年后,(2021 年 1 月)

我找到了以下包:

https://pypi.org/project/base32-crockford/

base32-克罗克福德

实现备用 base32 编码的 Python 模块 道格拉斯·克罗克福德 (Douglas Crockford) 描述: http://www.crockford.com/wrmg/base32.html.

他将编码设计为:

    Be human and machine readable
    Be compact
    Be error resistant
    Be pronounceable

它使用 10 位数字和 22 个字母的符号集,不包括 I、L O 和 U.解码不区分大小写,'i'和'l'转换为 '1' 和 'o' 被转换为 '0'。编码只使用大写 字符。

连字符可以出现在符号字符串中以提高可读性,并且 解码时被移除。

可以将检查符号附加到符号字符串以检测错误 在字符串中。

【讨论】:

【参考方案2】:

我找到了numconv 包,它似乎提供了这个?

【讨论】:

【参考方案3】:

对于您想做的事情,字典可能有点矫枉过正。为什么不只使用一个元组:

convTable = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V')

这将使查找速度更快,同时还可以节省内存。

如果您只是查找 0-31 范围内的整数,那么您可以这样做:

getHex32Rep(val):
    return convTable[val]

另外,你可能想这样做:

if(binRep[-1]!='1'):

而不是

if(binRep[-1:]!='1'):

【讨论】:

好点,binRep[-1] 和 binRep[-1:] 有什么区别? binRep[-1] 返回binRep 的最后一个元素。 binRep[-1] 返回一个仅包含 binRep 的最后一个元素的列表,因为 : 运算符创建一个列表切片,而不是访问数组的元素。 只用一个字符串而不是元组也可以很好地工作:convTable = '0123456789ABCDEFGHIJKLMNOPQRSTUV'【参考方案4】:

另一种制作 convDict 的方法

>>> import string
>>> convDict = c:int(c,32) for c in (string.digits+string.ascii_lowercase)[:32]
>>> convDict
'1': 1, '0': 0, '3': 3, '2': 2, '5': 5, '4': 4, '7': 7, '6': 6, '9': 9, '8': 8, 'a': 10, 'c': 12, 'b': 11, 'e': 14, 'd': 13, 'g': 16, 'f': 15, 'i': 18, 'h': 17, 'k': 20, 'j': 19, 'm': 22, 'l': 21, 'o': 24, 'n': 23, 'q': 26, 'p': 25, 's': 28, 'r': 27, 'u': 30, 't': 29, 'v': 31

【讨论】:

这种语法 (key:val for key in iterable) 是否仅在特定版本的 Python 中可用?我在 Python 2.6 中遇到语法错误。 @Christopher,是的,它是 2.7+。在 2.6 中,等价于 dict((c,int(c,32)) for c in (string.digits+string.ascii_lowercase)[:32])

以上是关于Python:整数到 Base 32 hex(又名 Triacontakaidecimal)的主要内容,如果未能解决你的问题,请参考以下文章

python各种类型的转换

磁力链接的BASE32编码向HEX编码的转换

磁力链接的BASE32编码向HEX编码的转换

在SMT32程序HEX文件中加入固件版本信息

python数字常量

如何为 Base32 类使用不同的字母表?