Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import string
- import math
- b64Chars = (string.ascii_uppercase + string.ascii_lowercase + string.digits + "+/").encode()
- b64BackChars = \
- (
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
- -1, 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- )
- def b64_chunk(byteChunk):
- byteChunk = byteChunk[:3]
- if len(byteChunk) == 3:
- ret = (
- byteChunk[0] >> 2,
- ((byteChunk[0] & 0x3) << 4) + (byteChunk[1] >> 4),
- ((byteChunk[1] & 0xF) << 2) + (byteChunk[2] >> 6),
- byteChunk[2] & 0x3F
- )
- if len(byteChunk) == 2:
- ret = (
- byteChunk[0] >> 2,
- ((byteChunk[0] & 0x3) << 4) + (byteChunk[1] >> 4),
- ((byteChunk[1] & 0xF) << 2),
- -1
- )
- if len(byteChunk) == 1:
- ret = (
- byteChunk[0] >> 2,
- ((byteChunk[0] & 0x3) << 4),
- -1,
- -1
- )
- if len(byteChunk) == 0:
- ret = (-1, -1, -1, -1)
- return ret
- def b64_strChunk(byteChunk):
- byteChunk = b64_chunk(byteChunk)
- ret = bytearray()
- for i in byteChunk[::-1]:
- if i == -1:
- ret += b'='
- else:
- ret += b64Chars[i:i+1]
- ret = ret[::-1]
- return ret
- def b64_encode(byteStream):
- ret = b''
- for i in range(math.ceil(len(byteStream) / 3)):
- i *= 3
- ret += b64_strChunk(byteStream[i:i+3])
- return ret
- def b64_unstring(b64Chunk):
- ret = []
- for i in b64Chunk:
- if i == b'='[0]:
- ret.append(-1)
- elif b64BackChars[i] == -1:
- raise ValueError("\'{}\' not a valid base64 character".format(ord(i)))
- else:
- ret.append(b64BackChars[i])
- return ret
- def b64_unchunk(b64Chunk):
- numChunk = b64_unstring(b64Chunk)
- padCount = 0
- padInvalid = 0
- ret = [-1] * 3
- for i in numChunk[::-1]:
- if i == -1:
- if padInvalid: raise ValueError("invalid padding for \"{}\"".format(b64Chunk.decode()))
- padCount += 1
- else:
- padInvalid = 1
- if padCount == 0:
- ret[0] = (numChunk[0] << 2) + (numChunk[1] >> 4)
- ret[1] = ((numChunk[1] & 0xF) << 4) + (numChunk[2] >> 2)
- ret[2] = ((numChunk[2] & 0x3) << 6) + numChunk[3]
- if padCount == 1:
- ret[0] = (numChunk[0] << 2) + (numChunk[1] >> 4)
- ret[1] = ((numChunk[1] & 0xF) << 4) + (numChunk[2] >> 2)
- if padCount == 2:
- ret[0] = (numChunk[0] << 2) + (numChunk[1] >> 4)
- if padCount == 3:
- raise ValueError("invalid amount of padding")
- return ret
- def b64_strUnchunk(b64Chunk):
- byteChunk = b64_unchunk(b64Chunk)
- ret = bytearray()
- for i in byteChunk:
- if i == -1:
- break
- else:
- ret += bytes([i])
- return ret
- def b64_decode(b64Stream):
- ret = b''
- for i in range(math.ceil(len(b64Stream) / 4)):
- i *= 4
- ret += b64_strUnchunk(b64Stream[i:i+4])
- return ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement