从Base64转换的字符串长度必须是4的倍数吗?

3

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

c# Convert.FromBase64String函数要求输入必须是4的倍数。

然而,如果我给它一个25个字符的字符串,它不会抱怨。

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

两种方法都可以。(第一种是24,第二种是25)

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

出现“无效长度异常”错误

我认为这是c#库中的一个bug,但我想确认一下 - 我正在编写代码来嗅探字符串以查看它们是否是有效的base64字符串,并且我想确保我理解什么是有效的base64字符串(一个可能的实现是将字符串传递给system.convert并查看它是否抛出异常 - 为什么要重新发明完美的代码)


1
我现在同样感到困惑。 - Jonesopolis
这真的很奇怪。我本来期望第二个字符串会像你提供的最后一个字符串一样失败,或者最后一个字符串像第二个字符串一样优雅地通过。o.O - user2819245
我在想要吸引Skeet的注意力需要做些什么。 - pm100
@pm100 关于LINQ提出了一个问题。 - Jonesopolis
1个回答

3

是的,这是一个缺陷(也称为错误)。它是由于一个名为FromBase64_ComputeResultLength()的内部帮助函数中的性能优化而开始的,该函数计算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个字符的字符串而言就是这种情况。
您可以在connect.microsoft.com上报告这个问题,我没有看到与它相似的现有报告。需要注意的是,Microsoft 实际上很难立即修复它,因为更改会破坏现有程序,这些程序现在可以成功地解析错误的 base64 字符串。通常需要进行重大的.NET发布更新来消除这类问题,比如.NET 4.0所做的那样,据我所知,目前没有计划推出新版本。
但是,您的简单解决方案是检查字符串长度是否可被4整除,并使用%运算符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接