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

Qué*_*dre 4 .net c# base64

我想知道为什么从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".
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 13

由于编码规则.当最后四个字符组包含两个填充字符时(如此处所示),它将解码为单个字节.这意味着解码将考虑编码到第一个字符中的所有6个比特,以及编码到第二个字符中的2个比特.

base64字母表中, g对应于十进制32和q十进制42.当转换为6位二进制时,这两个值都将其2个最高有效位设置为10:

Base64   Decimal   Binary
   g       32      100000
   h       33      100001
          ....
   q       42      101010
                   ^^
Run Code Online (Sandbox Code Playgroud)

由于只有这两位进入解码输出,因此输出也是相同的(同样的,在[32,47]范围内的任何小数=>范围内的任何base64数字[d,v]将产生相同的结果在第二个位置替换).这一切都是这样的:

Printable         d        g         =     =
Bits              011101   10xxxx    -     -
                  ^^^^^^   ^^
                    |       \-------------------------------\
Interpretation      \-----------------------------------\   |
                                                        |   |
                                                        v   v
Result (binary)                                       01110110
Result (ASCII)                                     the letter "v"
Run Code Online (Sandbox Code Playgroud)