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))
1
Pastsong 2023-02-03 18:27:55 +08:00 via Android
base64 里没 /吧
|
2
voidemoer 2023-02-03 18:29:02 +08:00
因为里面本来就有不可见字符 /非法字符不在任何编码方式中,可以 decode(‘utf-8’,'ignore'),使用 ignore 参数略过不在 utf-8 编码范围的字符就能出来了
|
3
imaple 2023-02-03 18:31:07 +08:00
这串一共 257 个字符,减掉 2 个=,也就是有(255*6-4)位除以八没法除尽
|
4
imaple 2023-02-03 18:36:39 +08:00
另外看你的代码,自己给 base64 附加了==,这显然不合理,不会你的 base64encode 代码也有相关的逻辑,那肯定是错的
|
5
jfcherng 2023-02-03 18:37:48 +08:00
用 latin1 編碼
|
6
deplivesb 2023-02-03 18:50:14 +08:00
你这个 手动给 编码强行添加俩== 的操作就没看懂
if '==' not in base64_str: base64_str = base64_str + '==' 最后的=只有在字符数量不是 4 的倍数才在末尾用=补齐,你这个不判断数量,直接加俩==是啥操作? |