Base64.DecodeFromUtf8-Methoden ignorieren Leerzeichen
Die Convert.FromBase64String(String)-, Convert.FromBase64CharArray(Char[], Int32, Int32)- und entsprechenden Try
-Methoden für System.Convert ignorieren die ASCII-Leerzeichen „ “„,“, „\t“, „\r“ und „\n“ und lassen eine beliebige Anzahl solcher Leerzeichen in der Eingabe zu. Als jedoch die Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean)- und Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32)-Methoden hinzugefügt wurden, ignorierten sie diese Leerzeichen nicht und schlugen stattdessen bei der Decodierung jeder Leerzeichen enthaltenden Eingabe fehl. Dadurch unterschied sich das Verhalten der UTF16-basierten APIs von dem der UTF8-basierten APIs. Außerdem bedeutete dies Folgendes:
- Die
Base64.DecodeFromUtf8
- undBase64.DecodeFromUtf8InPlace
-Methoden konnten die mit UTF codierten base-64-codierten Daten, die von Convert.FromBase64String(String) mit der Option Base64FormattingOptions.InsertLineBreaks generiert wurden, nicht kompatibel machen. - Die neuen Methoden IsValid(ReadOnlySpan<Char>) und IsValid(ReadOnlySpan<Byte>) müssten sich entweder untereinander oder mit ihren entsprechenden Methoden für UTF-16- und UTF-8-Daten für Convert und Base64 inkonsistent verhalten.
Dank dieser Änderung ignorieren die Methoden DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) und DecodeFromUtf8InPlace(Span<Byte>, Int32) nun Leerzeichen in der Eingabe.
Vorheriges Verhalten
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) und Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) konnte keine Eingabe verarbeiten, die Leerzeichen enthielt, und OperationStatus.InvalidData wurde zurückgegeben, wenn Leerzeichen gefunden wurden.
Neues Verhalten
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) und Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) ignorieren jetzt Leerzeichen (insbesondere „ “„,“, „\t“, „\r“ und „\n“) in der Eingabe, was dem Verhalten von Convert.FromBase64String(String) entspricht.
Eingeführt in Version
.NET 8 Vorschauversion 5
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Die Änderung wurde aus folgenden Gründen vorgenommen:
- Die Base64-Methoden können einen größeren Bereich von Eingabedaten decodieren, einschließlich:
- Daten, die von Convert.ToBase64String mit der Option Base64FormattingOptions.InsertLineBreaks generiert werden.
- Allgemeine Formatierung von Daten in Konfigurationsdateien und anderen realen Datenquellen.
- Die Base64-Methoden sind mit den entsprechenden Decodierungs-APIs für Convert konsistent.
- Die neuen Base64.IsValid(ReadOnlySpan<Char>)- und Base64.IsValid(ReadOnlySpan<Byte>)-APIs können so hinzugefügt werden, dass ihr Verhalten untereinander und mit den vorhandenen Convert- und Base64-APIs konsistent ist.
Empfohlene Maßnahme
Wenn das neue Verhalten für Ihren Code problematisch ist, können Sie IndexOfAny(" \t\r\n"u8)
aufrufen, um die Eingabe nach dem Leerzeichen zu durchsuchen, das zuvor das Ergebnis InvalidData ausgelöst hätte.