我试图为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用于节省内存,因此不必调用太多。它可以存储数组或数组的一部分,但是我仍然不知道如何在该方法中使用它。
答案 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));
}