Base64.DecodeFromUtf8 方法忽略空格
System.Convert 上的 Convert.FromBase64String(String)、Convert.FromBase64CharArray(Char[], Int32, Int32) 和相应的 Try
方法忽略 ASCII 空格字符“ ”、“\t”、“\r”和“\n”,并允许输入中存在任意数量的此类空格。 但是,添加 Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) 和 Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) 方法时,它们不会忽略这些空格字符,而是无法解码任何包含空格的输入。 这使得基于 UTF16 的 API 的行为不同于基于 UTF8 的 API 的行为。 这也意味着:
Base64.DecodeFromUtf8
和Base64.DecodeFromUtf8InPlace
方法无法往返 Convert.FromBase64String(String) 使用 Base64FormattingOptions.InsertLineBreaks 选项生成的 UTF 编码的 base-64 编码数据。- 新的 IsValid(ReadOnlySpan<Char>) 和 IsValid(ReadOnlySpan<Byte>) 方法需要行为彼此不一致,或者需要行为与 Convert 和 Base64 上的 UTF-16 和 UTF-8 数据的相应方法不一致。
实施此更改后,DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) 和 DecodeFromUtf8InPlace(Span<Byte>, Int32) 方法现在忽略输入中的空格。
旧行为
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) 和 Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) 原先无法处理包含空格的输入,如果遇到任何空格,则返回 OperationStatus.InvalidData。
新行为
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) 和 Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) 现在忽略输入中的空格(特别是“ ”、“\t”、“\r”和“\n”),这与 Convert.FromBase64String(String) 的行为一致。
引入的版本
.NET 8 预览版 5
中断性变更的类型
此更改为行为更改。
更改原因
此更改的目的是:
- Base64 方法可以解码更广泛的输入数据,包括:
- Convert.ToBase64String 使用 Base64FormattingOptions.InsertLineBreaks 选项生成的数据。
- 配置文件和其他真实数据源中的常见格式的数据。
- Base64 方法与 Convert 上对应的解码 API 一致。
- 添加新的 Base64.IsValid(ReadOnlySpan<Char>) 和 Base64.IsValid(ReadOnlySpan<Byte>) API 的方式可以使其行为彼此一致,并与现有 Convert 和 Base64 API 保持一致。
建议的操作
如果新行为对代码而言存在问题,则可以调用 IndexOfAny(" \t\r\n"u8)
,在输入中搜索以前会触发 InvalidData 结果的空格。