def a64l(s): """ An implementation of a64l as from the c stdlib. Convert between a radix-64 ASCII string and a 32-bit integer. '.' (dot) for 0, '/' for 1, '0' through '9' for [2,11], 'A' through 'Z' for [12,37], and 'a' through 'z' for [38,63]. TODO: do some implementations use '' instead of '.' for 0? >>> a64l('.') 0 >>> a64l('ZZZZZZ') 40359057765L #only the first 6 chars are significant >>> a64l('ZZZZZZ.') 40359057765L >>> a64l('A') 12 >>> a64l('Chris') 951810894 """ MASK = 0xffffffff BITSPERCHAR = 6 orda, ordZ, ordA, ord9, ord0 = ord('a'), ord('Z'), ord('A'), ord('9'), ord('0') r = 0 for shift, c in enumerate(s[:6]): c = ord(c) if c > ordZ: c -= orda - ordZ - 1 if c > ord9: c -= ordA - ord9 - 1 r = (r | ((c - (ord0 - 2)) << (shift * BITSPERCHAR))) & MASK return r