`
marlonyao
  • 浏览: 249655 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python下Base64编码

阅读更多
在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)


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics