如何在Convert.TryFromBase64String()中使用Span?

时间:2018-07-12 08:16:23

标签: c# .net-core base64

我试图为try catch写一些Convert.FromBase64String(),但发现它已经具有TryFromBase64String()方法。但是它需要3个参数:

public static bool TryFromBase64String(string s, Span<byte> bytes, out int bytesWritten);

那我怎么在那里使用Span<byte> bytes

我仅在文档中找到了此内容,但没有适当的描述。也许这太明显了。

https://docs.microsoft.com/en-us/dotnet/api/system.convert.tryfrombase64string?view=netcore-2.1

感谢@Damien_The_Unbeliever和THIS文章,我对Span有了更多了解。所以...

Span用于节省内存,因此不必调用太多。它可以存储数组或数组的一部分,但是我仍然不知道如何在该方法中使用它。

2 个答案:

答案 0 :(得分:3)

如链接的问题所述,System.Span<T>是C#7.2的新功能(而Convert.TryFromBase64String是.NET Core的新功能)

要使用System.Span<>,您必须安装nuget软件包:

Install-Package System.Memory

然后使用它:

byte[] buffer = new byte[((b64string.Length * 3) + 3) / 4 -
    (b64string.Length > 0 && b64string[b64string.Length - 1] == '=' ?
        b64string.Length > 1 && b64string[b64string.Length - 2] == '=' ?
            2 : 1 : 0)];

int written;
bool success = Convert.TryFromBase64String(b64string, buffer, out written);

其中b64string是您的base-64字符串。 buffer的过于复杂的大小应该是基于b64string的长度的缓冲区的确切长度。

答案 1 :(得分:2)

您可以像这样使用它,并利用所有TryFromBase64String参数:

public string DecodeUtf8Base64(string input)
{
  var bytes = new Span<byte>(new byte[256]); // 256 is arbitrary

  if (!Convert.TryFromBase64String(input, bytes, out var bytesWritten))
  {
    throw new InvalidOperationException("The input is not a valid base64 string");
  }

  return Encoding.UTF8.GetString(bytes.Slice(0, bytesWritten));
}