implement base32 encoding based on http://www.crockford.com/wrmg/base32.html from32/to32
This commit is contained in:
parent
8c61808d6e
commit
7649daf6a2
1 changed files with 77 additions and 0 deletions
|
@ -3,6 +3,83 @@
|
||||||
import math
|
import math
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
def to32(q):
|
||||||
|
"""
|
||||||
|
Converts an integer to base 32
|
||||||
|
We exclude 4 of the 26 letters: I L O U.
|
||||||
|
http://www.crockford.com/wrmg/base32.html
|
||||||
|
|
||||||
|
>>> to32(35)
|
||||||
|
'13'
|
||||||
|
>>> to32(119292)
|
||||||
|
'3MgV'
|
||||||
|
>>> to32(939387374)
|
||||||
|
'wZwTgD'
|
||||||
|
>>> to32(0)
|
||||||
|
'0'
|
||||||
|
>>> to32(-393)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: must supply a positive integer
|
||||||
|
"""
|
||||||
|
|
||||||
|
if q < 0: raise ValueError, "must supply a positive integer"
|
||||||
|
letters = "0123456789ACBEDGFHKJMNQPSRTWVYXZ"
|
||||||
|
converted = []
|
||||||
|
upper = True
|
||||||
|
while q != 0:
|
||||||
|
q, r = divmod(q, 32)
|
||||||
|
l = letters[r]
|
||||||
|
if upper:
|
||||||
|
upper = False
|
||||||
|
else:
|
||||||
|
l = l.lower()
|
||||||
|
upper = True
|
||||||
|
converted.insert(0, l)
|
||||||
|
return "".join(converted) or '0'
|
||||||
|
|
||||||
|
def from32(q):
|
||||||
|
_32map = {
|
||||||
|
'0': 0,
|
||||||
|
'1': 1,
|
||||||
|
'2': 2,
|
||||||
|
'3': 3,
|
||||||
|
'4': 4,
|
||||||
|
'5': 5,
|
||||||
|
'6': 6,
|
||||||
|
'7': 7,
|
||||||
|
'8': 8,
|
||||||
|
'9': 9,
|
||||||
|
'A': 10,
|
||||||
|
'B': 11,
|
||||||
|
'C': 12,
|
||||||
|
'D': 13,
|
||||||
|
'E': 14,
|
||||||
|
'F': 15,
|
||||||
|
'G': 16,
|
||||||
|
'H': 17,
|
||||||
|
'J': 18,
|
||||||
|
'K': 19,
|
||||||
|
'M': 20,
|
||||||
|
'N': 21,
|
||||||
|
'P': 22,
|
||||||
|
'Q': 23,
|
||||||
|
'R': 24,
|
||||||
|
'S': 25,
|
||||||
|
'T': 26,
|
||||||
|
'V': 27,
|
||||||
|
'W': 28,
|
||||||
|
'X': 29,
|
||||||
|
'Y': 30,
|
||||||
|
'Z': 31,
|
||||||
|
'O': 0,
|
||||||
|
'I': 1,
|
||||||
|
'L': 1,
|
||||||
|
}
|
||||||
|
base32 = '0123456789ABCDEFGHIJKLMNOPQRSTUV'
|
||||||
|
q = ''.join([base32[_32map[i.upper()]] for i in q])
|
||||||
|
return int(q, 32)
|
||||||
|
|
||||||
def to36(q):
|
def to36(q):
|
||||||
"""
|
"""
|
||||||
Converts an integer to base 36 (a useful scheme for human-sayable IDs
|
Converts an integer to base 36 (a useful scheme for human-sayable IDs
|
||||||
|
|
Loading…
Reference in a new issue