在python下有Base64编码的库,可直接用。
我自己写了一个,主要是想调整编码字符的顺序。
注意:如果只是想调整最后两个字符(默认为"+/"),用不着自己写,b64encode有个altchars参数,用来指定最后两个字符。
完整代码:
复制代码 代码示例:
_keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
def b64encode(s):
res = []
leftover = len(s) % 3
for i in range(0, len(s)-leftover, 3):
c2 = ord(s[i])
c1 = ord(s[i+1])
c0 = ord(s[i+2])
res.append(_keyStr[(c2 >> 2) & 0x3f])
res.append(_keyStr[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
res.append(_keyStr[((c1 & 0x0f) << 2) | ((c0 >> 6) & 0x03)])
res.append(_keyStr[c0 & 0x3f])
i += 3
if leftover == 1:
c2 = ord(s[i])
res.append(_keyStr[(c2 >> 2) & 0x3f])
res.append(_keyStr[(c2 & 0x3) << 4])
res.append(_keyStr[-1])
res.append(_keyStr[-1])
elif leftover == 2:
c2 = ord(s[i])
c1 = ord(s[i+1])
res.append(_keyStr[(c2 >> 2) & 0x3f])
res.append(_keyStr[((c2 & 0x3) << 4) | ((c1 >> 4) & 0x0f)])
res.append(_keyStr[(c1 & 0x0f) << 2])
res.append(_keyStr[-1])
return ''.join(res)
def b64decode(s):
res = []
end = len(s)
if s[-1] == _keyStr[-1]:
end -= 4
for i in range(0, end, 4):
c3, c2, c1, c0 = _keyStr.index(s[i]), _keyStr.index(s[i+1]), _keyStr.index(s[i+2]), _keyStr.index(s[i+3])
res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
res.append(chr(((c1 & 0x03) << 6) | (c0 & 0x03f)))
if end < len(s):
if s[-2] == _keyStr[-1]:
c3, c2 = _keyStr.index(s[end]), _keyStr.index(s[end+1])
res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
else:
c3, c2, c1 = _keyStr.index(s[end]), _keyStr.index(s[end+1]), _keyStr.index(s[end+2])
res.append(chr(((c3 << 2)) | ((c2 >> 4) & 0x03)))
res.append(chr(((c2 & 0x0f) << 4) | ((c1 >> 2) & 0x0f)))
return ''.join(res)