Python base64 解码,不同的字符串解码出来的内容一致是什么原因?
python2.7 环境,调用 base64.b64decode()方法进行解析,下面两个字符串(区别在于字符串开始有没有下划线)解析出来的内容一致,求教这是怎么回事....
result1 = base64.b64decode('_Y62pWdlMDnkQMUYjYOUkVQ==')
result2 = base64.b64decode('Y62pWdlMDnkQMUYjYOUkVQ==')
result = result1 == result2 # result: True
Python base64 解码,不同的字符串解码出来的内容一致是什么原因?
下划线又不是 64 个字符集里的,就给忽略了吧
这种情况通常是因为你解码的字符串虽然不同,但经过base64解码后得到了相同的二进制数据。Base64编码是把3字节二进制数据编码成4个ASCII字符,所以不同的字符串可能对应相同的原始数据。
最常见的原因是:
- 填充字符不同:Base64编码末尾的
=填充符是可选的,"YQ=="和"YQ"解码后都是"a" - URL安全变体:
+和/在URL安全版本中会被替换为-和_ - 换行符和空格:有些实现会自动忽略换行符和空格
- 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 下 +/替换-_

