V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tg11
V2EX  ›  Python

遇到一个很诡异的 base64 字符串, Python 无法解码

  •  
  •   tg11 · 2023-02-03 17:59:40 +08:00 · 2288 次点击
    这是一个创建于 437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    base64 转二进制后,二进制无法解码成正常字符串。

    我尝试了以下这几种编码,都无法解码:

    utf8 、ISO-8859-5 、KOI8-R 、Windows-1251 、IBM855

    但用 js 前端可以正常解码,是一串西里尔字母。

    原码如下:

    # -*- coding: utf-8 -*-
    import base64
    import chardet
    
    a = '0JLQvtC70LXQudCx0L7Quy4g0KfQtdC80L/QuNC+0L3QsNGCINCg0L7RgdGB0LjQuC4gUGFyaSDQodGD0L/QtdGA0LvQuNCz0LAuINCc0YPQttGH0LjQvdGLLiAi0JvQvtC60L7QvNC+0YLQuNCyIiAo0J3QvtCy0L7RgdC40LHQuNGA0YHQuikgLSAi0JTQuNC90LDQvNC+LdCb0J4iICjQm9C10L3QuNC90LPRgNCw0LTRgdC60LDRjyDQvtC=='
    
    
    def base64decode(base64_str):
        if '==' not in base64_str:
            base64_str = base64_str + '=='
        bytes_str = base64.b64decode(base64_str)
        print(bytes_str)
        encoding = chardet.detect(bytes_str)['encoding']
        return bytes_str.decode(encoding=encoding)
    
    
    print(base64decode(a))
    
    
    9 条回复    2023-02-03 23:02:58 +08:00
    Pastsong
        1
    Pastsong  
       2023-02-03 18:27:55 +08:00 via Android
    base64 里没 /吧
    voidemoer
        2
    voidemoer  
       2023-02-03 18:29:02 +08:00
    因为里面本来就有不可见字符 /非法字符不在任何编码方式中,可以 decode(‘utf-8’,'ignore'),使用 ignore 参数略过不在 utf-8 编码范围的字符就能出来了
    imaple
        3
    imaple  
       2023-02-03 18:31:07 +08:00
    这串一共 257 个字符,减掉 2 个=,也就是有(255*6-4)位除以八没法除尽
    imaple
        4
    imaple  
       2023-02-03 18:36:39 +08:00
    另外看你的代码,自己给 base64 附加了==,这显然不合理,不会你的 base64encode 代码也有相关的逻辑,那肯定是错的
    jfcherng
        5
    jfcherng  
       2023-02-03 18:37:48 +08:00
    用 latin1 編碼
    deplivesb
        6
    deplivesb  
       2023-02-03 18:50:14 +08:00
    你这个 手动给 编码强行添加俩== 的操作就没看懂
    if '==' not in base64_str:
    base64_str = base64_str + '=='

    最后的=只有在字符数量不是 4 的倍数才在末尾用=补齐,你这个不判断数量,直接加俩==是啥操作?
    tg11
        7
    tg11  
    OP
       2023-02-03 22:58:25 +08:00
    @deplivesb 因为收到的参数全都没==,b64decode 方法没有==就给我报错了
    tg11
        8
    tg11  
    OP
       2023-02-03 22:58:39 +08:00
    @imaple 因为收到的参数全都没==,b64decode 方法没有==就给我报错了,所以我手动加的
    tg11
        9
    tg11  
    OP
       2023-02-03 23:02:58 +08:00
    @voidemoer 感谢!确实管用了。另外这个 base64 是第三方接口的,不规范我一点也没办法。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5279 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:39 · PVG 17:39 · LAX 02:39 · JFK 05:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.