Python: Base43 string decoding
Posted by valqk on
This is a reimplementation in python from: https://github.com/jacoblyles/base43js
import copy class Base43: def __init__(self): self.base43Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$*+-./:' """long division with an arbitrary base.""" def divMod(self,byteArr, base, divisor, startAt): result = copy.copy(byteArr)#.slice(); remainder = 0 temp = None; startAt = startAt if startAt else 0; for i in range(startAt, len(byteArr)): temp = remainder * base + byteArr[i] result[i] = temp / divisor remainder = temp % divisor; return { 'div': result, 'mod': remainder, } def byteArrGreaterThan(self,byteArr, limit): length = len(byteArr) last = byteArr[length - 1] if last >= limit: return True else: for i in range(0, (length-1)): if byteArr[i] > 0: return True return False; #input is a base-43 string, output is a hex string def decode(self,input): result = [] input43 = [] for i in range(0,len(input)): input43.append(i+100) i=0 for l in input: index = self.base43Chars.find(l) if (index < 0): raise Exception("Illegal character. Allowed characters are:" + self.base43Chars) #print "D: "+str(i)+' -> '+l+" -> "+str(index) input43[i] = index i += 1 zeroCount = 0; pad = ''; while zeroCount < len(input) and input43[zeroCount] == 0: zeroCount += 1; pad += '0'; startAt = zeroCount r=None while self.byteArrGreaterThan(input43, 256): r = self.divMod(input43, 43, 256, startAt); input43 = r['div']; result.append(chr(r['mod'])); result.append(chr(r['div'].pop())); result.reverse() r1 = '' ret = '' for r in result: r1=str((hex(ord(r)))).replace('0x','') if len(r1)<2: ret += "0"+r1 else: ret += r1 return pad + ret