decode64 - Codificación Python base 36
decode64 linux (7)
¿Cómo puedo codificar un entero con base 36 en Python y luego decodificarlo nuevamente?
¿Has probado el código de muestra de Wikipedia?
def base36encode(number, alphabet=''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ''):
"""Converts an integer to a base36 string."""
if not isinstance(number, (int, long)):
raise TypeError(''number must be an integer'')
base36 = ''''
sign = ''''
if number < 0:
sign = ''-''
number = -number
if 0 <= number < len(alphabet):
return sign + alphabet[number]
while number != 0:
number, i = divmod(number, len(alphabet))
base36 = alphabet[i] + base36
return sign + base36
def base36decode(number):
return int(number, 36)
print base36encode(1412823931503067241)
print base36decode(''AQF8AA0006EH'')
Esto funciona si solo te importan los enteros positivos.
def int_to_base36(num):
"""Converts a positive integer into a base36 string."""
assert num >= 0
digits = ''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ''
res = ''''
while not res or num > 0:
num, i = divmod(num, 36)
res = digits[i] + res
return res
Para volver a convertir a int, simplemente use int(num, 36)
. Para una conversión de bases arbitrarias, consulte https://gist.github.com/mbarkhau/1b918cb3b4a2bdaf841c
Ojalá hubiera leído esto antes. Aquí está la respuesta:
def base36encode(number):
if not isinstance(number, (int, long)):
raise TypeError(''number must be an integer'')
if number < 0:
raise ValueError(''number must be positive'')
alphabet, base36 = [''0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'', '''']
while number:
number, i = divmod(number, 36)
base36 = alphabet[i] + base36
return base36 or alphabet[0]
def base36decode(number):
return int(number, 36)
print(base36encode(1412823931503067241))
print(base36decode(''AQF8AA0006EH''))
Puede usar https://github.com/tonyseek/python-base36 .
$ pip install base36
y entonces
>>> import base36
>>> assert base36.dumps(19930503) == ''bv6h3''
>>> assert base36.loads(''bv6h3'') == 19930503
Puedes usar numpy base_repr(...)
para esto.
import numpy as np
num = 2017
num = np.base_repr(num, 36)
print(num) # 1K1
num = int(num, 36)
print(num) # 2017
Aquí hay información sobre numpy , base_repr(...) y np.base_repr(number, base=2, padding=0)
.
(Esta respuesta se envió originalmente como una edición de la respuesta de @ christopher-beland, pero se rechazó a favor de su propia respuesta).
Respuesta terrible, pero solo estaba jugando con esto un pensamiento que compartiría.
import string, math
int2base = lambda a, b: ''''.join(
[(string.digits + string.lowercase + string.uppercase)[(a/b**i)%b]
for i in xrange(int(math.log(a, b)), -1, -1)]
)
num = 1412823931503067241
test = int2base(num, 36)
test2 = int(test, 36)
print test2 == num
from numpy import base_repr
num = base_repr(num, 36)
num = int(num, 36)
Aquí hay información sobre numpy .