在C#中解码Base64有时会产生错误的结果,并带有一个额外的填充字符

det*_*zed 6 .net c# base64

我偶然发现了Convert.FromBase64String.NET 4.7.2中的一种奇怪行为。通常,当填充不正确时,它将引发异常。但是我发现添加其他填充字符会产生错误结果而不是异常的情况。

var correct = Convert.FromBase64String("YWE=");
Run Code Online (Sandbox Code Playgroud)

在这种情况下correct[97, 97]"aa"为字符串形式。但是当我添加另一个=

var incorrect = Convert.FromBase64String("YWE==");
Run Code Online (Sandbox Code Playgroud)

而不是得到一个例外,我少了一个字节,并且incorrect[88]或是"X"字符串形式。

奇怪的。这是一个错误,应该报告吗?还是已知/记录的行为?我找不到对此的任何引用。

比较Ruby。计算结果为"aa"

Base64.strict_decode64 "YWE="
Run Code Online (Sandbox Code Playgroud)

这引发了一个异常:

Base64.strict_decode64 "YWE=="

ArgumentError: invalid base64
from /usr/local/Cellar/ruby/2.6.1/lib/ruby/2.6.0/base64.rb:74:in `unpack1'
Run Code Online (Sandbox Code Playgroud)

det*_*zed 7

看起来这是一个错误:https : //github.com/dotnet/corefx/issues/30793 它已在.NET Core中修复,但仍存在于4.7.2之前的.NET Framework中。

此代码应异常终止,而不是打印1

using System;

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Convert.FromBase64String("YWE==").Length);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个测试:https : //dotnetfiddle.net/x2X9CT