为什么从两个不同的 base64 字符串转换返回相等的字节数组

本文关键字:返回 转换 字符串 数组 字节数 字节 base64 为什么 两个 | 更新日期: 2023-09-27 18:31:32

我想知道为什么从 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".

为什么从两个不同的 base64 字符串转换返回相等的字节数组

因为编码规则。当最后一个四个字符组包含两个填充字符(如此处的情况)时,它会解码为单个字节。这意味着解码将考虑编码为第一个字符的所有 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"