好的,所以从Base 32 hex(aka.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'
>>>
答案 0 :(得分: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'):
答案 1 :(得分:2)
制作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}
答案 2 :(得分:0)
我找到了numconv包,似乎提供了这个?
答案 3 :(得分:0)
十年后,(2021 年 1 月)
我找到了以下包:
https://pypi.org/project/base32-crockford/
<块引用>base32-crockford
实现替代 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'。编码只使用大写 字符。
符号字符串中可能会出现连字符以提高可读性,并且 解码时删除。
可以将校验符号附加到符号字符串以检测错误 在字符串中。