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

2023-02-03 17:59:40 +08:00
 tg11

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))

2505 次点击
所在节点    Python
9 条回复
Pastsong
2023-02-03 18:27:55 +08:00
base64 里没 /吧
voidemoer
2023-02-03 18:29:02 +08:00
因为里面本来就有不可见字符 /非法字符不在任何编码方式中,可以 decode(‘utf-8’,'ignore'),使用 ignore 参数略过不在 utf-8 编码范围的字符就能出来了
imaple
2023-02-03 18:31:07 +08:00
这串一共 257 个字符,减掉 2 个=,也就是有(255*6-4)位除以八没法除尽
imaple
2023-02-03 18:36:39 +08:00
另外看你的代码,自己给 base64 附加了==,这显然不合理,不会你的 base64encode 代码也有相关的逻辑,那肯定是错的
jfcherng
2023-02-03 18:37:48 +08:00
用 latin1 編碼
deplivesb
2023-02-03 18:50:14 +08:00
你这个 手动给 编码强行添加俩== 的操作就没看懂
if '==' not in base64_str:
base64_str = base64_str + '=='

最后的=只有在字符数量不是 4 的倍数才在末尾用=补齐,你这个不判断数量,直接加俩==是啥操作?
tg11
2023-02-03 22:58:25 +08:00
@deplivesb 因为收到的参数全都没==,b64decode 方法没有==就给我报错了
tg11
2023-02-03 22:58:39 +08:00
@imaple 因为收到的参数全都没==,b64decode 方法没有==就给我报错了,所以我手动加的
tg11
2023-02-03 23:02:58 +08:00
@voidemoer 感谢!确实管用了。另外这个 base64 是第三方接口的,不规范我一点也没办法。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/912975

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX