Convert.FromBase64String(String)、Convert.FromBase64CharArray(Char[], Int32, Int32)以及Try
上相应的System.Convert方法会忽略 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>) API 和 Base64.IsValid(ReadOnlySpan<Byte>) API,使其行为彼此一致,并与现有 Convert API 和 Base64 API 保持一致。
建议的措施
如果新行为对您的代码存在问题,您可以调用 IndexOfAny(" \t\r\n"u8)
来搜索输入中之前会触发 InvalidData 结果的空格。