Convert.FromBase64String的奇怪行为

egg*_*ert 3 c# base64

为什么以下代码

var s =  "2I==";
var b = Convert.FromBase64String(s);
var new_s = Convert.ToBase64String(b);
Run Code Online (Sandbox Code Playgroud)

结束了new_s 2A==

s 最初是一个更长的字符串(96个字符),但我不能包含它,因为它是一个密钥.

Jon*_*eet 5

根据维基百科,"2I =="表示数字54,8,(填充x2).

换句话说,代表的位是:

110110 000100 XXXXXX XXXXXX
Run Code Online (Sandbox Code Playgroud)

(其中X表示"我不在乎,它来自填充")

但是,因为填充表示此处只有一个字节的信息,所以第二个字符的最后4位是无关紧要的.与以往一样,我们可以将4个6位信息重新格式化为3个8位信息,此时它变得更加清晰:

11011000 0100XXXX XXXXXXXX
Run Code Online (Sandbox Code Playgroud)

您可以看到第二个字节必须是填充,因为它的一些位来自填充字符.因此,只有第一个字符和第二个字符的前两位是相关的 - 它只解码为单个字节0b11011000.

现在当你编码 0b11011000时,你知道你将有两个填充字符,第一个字符必须是'2'(表示位'110110'),但第二个字符可以是前两位代表'00'的任何字符.它只是Convert.ToBase64String使用'A',其中0位用于不相关的部分.

在我看来,问题是为什么编码器会选择使用"我"而不是"A".我不认为在Base64中这样做是无效的,但这是一个奇怪的选择.