Base64.DecodeFromUtf8 方法會忽略空格
Convert.FromBase64String(String)、Convert.FromBase64CharArray(Char[], Int32, Int32)、和 System.Convert 上的對應 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 Preview 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 結果的空白輸入。