FromBase64字符串长度必须是多个还是4个?

根据我的理解,base64编码的字符串(即编码的输出)必须始终是4的倍数。

c#Convert.FromBase64String表示它的输入必须是4的倍数

但是,如果我给它一个25个字符的字符串,它不会抱怨

[convert]::FromBase64String("ei5gsIELIki+GpnPGyPVBA==") [convert]::FromBase64String("1ei5gsIELIki+GpnPGyPVBA==") 

都工作。 (第一个是24,第二个是25)

 [convert]::FromBase64String("11ei5gsIELIki+GpnPGyPVBA==") 

失败,无效长度exception

我认为这是c#库中的一个错误,但我只想确定 – 我正在编写代码来嗅探字符串,看看它们是否是有效的base64字符串,我想确定我理解有效的字符串是什么样的(一个可能的实现是将字符串提供给system.convert并查看它是否抛出 – 为什么重新发明完美的代码)

是的,这是一个缺陷(又名bug)。 它是由于名为FromBase64_ComputeResultLength()的内部辅助函数中的perf优化而开始的,该函数计算byte []结果的长度。 它有这个评论(编辑适合):

  // For legal input, we can assume that 0 <= padding < 3. But it may be // more for illegal input. // We will notice it at decode when we see a '=' at the wrong place. 

“我们会注意到”的注释并不完全准确,如果没有预料到,解码器标记'='但是它无法检查是否有太多。 25-char字符串的情况如何。

您可以在connect.microsoft.com上报告问题,我没有看到类似它的现有报告。 请注意,由于更改将破坏现在成功解析错误的base64字符串的现有程序,因此微软很可能不会很快实际修复它。 它通常需要一个主要的.NET发布更新来摆脱这样的问题,就像它在.NET 4.0中所做的那样,没有一个即将发布。

但是,对您而言,简单的解决方法是检查字符串长度是否可被4整除,请使用%运算符。