我想知道为什么从 base64 字符串转换为不同的字符串返回相等的字节数组?
const string s1 = "dg==";
const string s2 = "dq==";
byte[] a1 = Convert.FromBase64String(s1);
byte[] a2 = Convert.FromBase64String(s2);
Console.WriteLine(a1.SequenceEqual(a2)); // prints "True".
因为编码规则。当最后一个四字符组包含两个填充字符(如这里的情况)时,它会解码为单个字节。这意味着解码将考虑编码为第一个字符的所有 6 位,加上编码为第二个字符的 2 位。
在base64 字母表 g
中,对应十进制 32 和q
十进制 42。当转换为 6 位二进制时,这两个值的 2 个最高有效位都设置为10
:
Base64 Decimal Binary
g 32 100000
h 33 100001
....
q 42 101010
^^
由于只有这两个位进入解码输出,因此输出也将是相同的(出于同样的原因,[32, 47] 范围内的任何小数 => 范围内的任何 base64 数字在以下情况下[d,v]
都会产生相同的结果替换为第二个位置)。这一切都是这样工作的:
Printable d g = =
Bits 011101 10xxxx - -
^^^^^^ ^^
| \-------------------------------\
Interpretation \-----------------------------------\ |
| |
v v
Result (binary) 01110110
Result (ASCII) the letter "v"