Os métodos Base64.DecodeFromUtf8 ignoram o espaço em branco
O Convert.FromBase64String(String), Convert.FromBase64CharArray(Char[], Int32, Int32)e os métodos correspondentes Try
ignoram System.Convert os caracteres de espaço em branco ASCII ' ', '\t', '\r' e '\n' e permitem que qualquer quantidade desse espaço em branco esteja na entrada. No entanto, quando os Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) métodos e Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) foram adicionados, eles não ignoraram esses caracteres de espaço em branco e, em vez disso, falharam em decodificar qualquer entrada que incluísse espaço em branco. Isso tornou o comportamento das APIs baseadas em UTF16 diferente do das APIs baseadas em UTF8. Significou também que:
- Os
Base64.DecodeFromUtf8
métodos eBase64.DecodeFromUtf8InPlace
não podiam fazer a viagem de ida e volta dos dados codificados em base 64 codificados por UTF produzidos pela Convert.FromBase64String(String) com a Base64FormattingOptions.InsertLineBreaks opção. - Os novos IsValid(ReadOnlySpan<Char>) e IsValid(ReadOnlySpan<Byte>) métodos precisariam ter um comportamento inconsistente entre si ou com seus métodos correspondentes para dados UTF-16 e UTF-8 em Convert e Base64.
Com essa alteração, os métodos e DecodeFromUtf8InPlace(Span<Byte>, Int32) agora ignoram o DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) espaço em branco na entrada.
Comportamento anterior
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) e Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) não conseguiu processar a entrada que continha espaço em branco e retornou OperationStatus.InvalidData se algum espaço em branco foi encontrado.
Novo comportamento
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) e Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) agora ignore o espaço em branco (especificamente ' ', '\t', '\r' e '\n') na entrada, que corresponde ao comportamento do Convert.FromBase64String(String).
Versão introduzida
.NET 8 Visualização 5
Tipo de mudança de rutura
Esta mudança é uma mudança comportamental.
Razão para a alteração
A alteração foi feita de modo a que:
- Os Base64 métodos podem decodificar uma gama mais ampla de dados de entrada, incluindo:
- Dados produzidos por Convert.ToBase64String com a Base64FormattingOptions.InsertLineBreaks opção.
- Formatação comum de dados em arquivos de configuração e outras fontes de dados reais.
- Os Base64 métodos são consistentes com as APIs de decodificação correspondentes no Convert.
- O novo Base64.IsValid(ReadOnlySpan<Char>) e Base64.IsValid(ReadOnlySpan<Byte>) as APIs podem ser adicionados de uma maneira em que seu comportamento seja consistente entre si e com as APIs existentes Convert Base64 .
Ação recomendada
Se o novo comportamento for problemático para o seu código, você pode ligar IndexOfAny(" \t\r\n"u8)
para pesquisar a entrada para o espaço em branco que anteriormente teria disparado um InvalidData resultado.