Convert.ToBase64String/Convert.FromBase64String 不返回原始字符串值


"encryptedHelloWorld=" ==
Convert.ToBase64String(
Convert.FromBase64String("encryptedHelloWorld="))

此语句返回错误的

Convert.ToBase64String(Convert.FromBase64String("encryptedHelloWorld="))

返回"encryptedHelloWorlc="

知道为什么吗?

encryptedHelloWorld=的原始值未正确地进行base-64编码。

最后一个"d"包含一个在此上下文中提取时被忽略的额外位,它出现在填充之前。更严格的base-64解码器可以有效地抛出错误。

最小的失败输入情况包括rld=abq=。只有带有填充的最后一部分是相关的,如下所述。

考虑以64为基的每个输出字符表示每个6位。

因此,rld=中编码的信息是:

  • r-6位
  • l-6位
  • d-6位(4个相关="c"+2个额外(
  • =-不适用

必须将其提取为2个字节(8+8=16位(。

然而,6+6+6=18位,并且不是8的倍数。有2个额外的位,它们在初始基64值中区分"c"one_answers"d",它们不反映实际的编码信息

在解码过程中,.NET解码器实现无声地丢弃"d"中的两个额外位,因为它们无处可去。(对于abq=作为"q">"c"的情况也是如此;请注意,大写字母在64进制输出空间中首先排序,因此"q"<"c"。(

在没有填充的正常情况下,每4个base-64字符平均解码3个字节,这就是为什么这个特定问题只出现在base-64字符串的末尾,该字符串不是4个base六十四字符的偶数倍(不包括填充字符(。

最新更新