1

https://docs.microsoft.com/en-us/dotnet/api/system.convert.tobase64string?view=net-5.0

它说

如果不存在整数个 3 字节组,则剩余字节有效地用零填充以形成一个完整组。在本例中,最后一个字节的值为十六进制 FF。前 6 位等于十进制 63,对应于输出末尾的 base-64 位“/”,接下来的 2 位用零填充以产生十进制 48,对应于 base-64 位,“w”。最后两个 6 位值是填充,对应于无值填充字符“=”。

现在,

想象一下我发送的字节数组是

0

所以,只有一个字节,即0

那一个字节将被填充到 000 对吗?

所以现在,我们将使用类似 0=== 作为编码,因为在 base 64 编码中需要 4 个字符来编码 3 个字节。

现在,我们将对其进行解码。

我们怎么知道原始字节不是 00 或 000,而只是 0?

我一定在这里遗漏了一些东西。

4

1 回答 1

1

所以现在,我们将有类似 0=== 作为编码

3 个填充字符是非法的。这将意味着 6 位加填充。

然后 0 作为字节值A在 Base64 中,所以它将是AA==.

因此,第一个 A 具有 0 字节的前 6 位,第二个 A 为您的字节贡献了 2 个剩余的 0 位,然后只有 4 个 0 位加上剩余的填充,不足以容纳第二个字节。

我们怎么知道原始字节不是 00 或 000,而只是 0?

AA==只有 12 位(每个字符 6 位)所以它只能编码 1 字节 => 0

AAA=有 18 位,足够 2 个字节 => 00

AAAA有 24 位 = 3 个字节 => 000

于 2020-12-03T17:01:10.220 回答