Python base64 解码,不同的字符串解码出来的内容一致是什么原因?

python2.7 环境,调用 base64.b64decode()方法进行解析,下面两个字符串(区别在于字符串开始有没有下划线)解析出来的内容一致,求教这是怎么回事....

result1 = base64.b64decode('_Y62pWdlMDnkQMUYjYOUkVQ==')
result2 = base64.b64decode('Y62pWdlMDnkQMUYjYOUkVQ==')
result = result1 == result2    # result: True

Python base64 解码,不同的字符串解码出来的内容一致是什么原因?

10 回复

下划线又不是 64 个字符集里的,就给忽略了吧


这种情况通常是因为你解码的字符串虽然不同,但经过base64解码后得到了相同的二进制数据。Base64编码是把3字节二进制数据编码成4个ASCII字符,所以不同的字符串可能对应相同的原始数据。

最常见的原因是:

  1. 填充字符不同:Base64编码末尾的=填充符是可选的,"YQ==""YQ"解码后都是"a"
  2. URL安全变体+/在URL安全版本中会被替换为-_
  3. 换行符和空格:有些实现会自动忽略换行符和空格
  4. Unicode编码差异:字符串看起来不同但实际编码相同

给你看个例子:

import base64

# 不同字符串解码出相同内容
str1 = "YQ=="  # 标准格式
str2 = "YQ"    # 无填充
str3 = "YQ\n"  # 带换行符

# 解码结果都一样
print(base64.b64decode(str1))  # b'a'
print(base64.b64decode(str2))  # b'a'
print(base64.b64decode(str3))  # b'a'

# URL安全变体
url_str = "YQ"
print(base64.urlsafe_b64decode(url_str))  # b'a'

检查一下你的字符串是不是这些情况,用print(repr(your_string))看看实际内容。

总结:检查编码格式和特殊字符。

我用 macOS 的命令解压出来是不一样的。

<br>$ echo "_Y62pWdlMDnkQMUYjYOUkVQ==" | base64 --decode<br>�ge09�@�����T%<br>$ echo "Y62pWdlMDnkQMUYjYOUkVQ==" | base64 --decode<br>c��Y�Ly1F#`�$U%<br>

base64 的 64 是指 10 个数字 + 26 个小写字母 + 26 个大写字母 + 斜杠 + 加号 再附加一个等号作为凑数的符号。一个 64 个有效符合加 1 个凑数符号。所以是没有下划线的。

ubuntu 下,同样命令,含下划线的直接报错:base64: invalid input

一楼正解,下划线给忽略了

标准 base64 没有下划线和问号,因为这个 url 里面传 base64 踩了大坑,

https://github.com/python/cpython/blob/master/Modules/binascii.c

468 - 470 行。

如果 ascii 字符大于 0x7f 的话,就忽略它了。

或者在 table_a2b_base64[] 里面位置为 -1 的。

下划线还是的。base64url 下 +/替换-_

回到顶部