Métodos Base64.DecodeFromUtf8 ignoram espaço em branco
Os métodos Convert.FromBase64String(String), Convert.FromBase64CharArray(Char[], Int32, Int32) e Try
correspondentes no System.Convert ignoram 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 métodos Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) 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. Isso também significava que:
- Os métodos
Base64.DecodeFromUtf8
eBase64.DecodeFromUtf8InPlace
não puderam fazer a viagem de ida e volta dos dados codificados em base 64 codificados em UTF produzidos por Convert.FromBase64String(String) com a opção Base64FormattingOptions.InsertLineBreaks. - Os novos métodos IsValid(ReadOnlySpan<Char>) e IsValid(ReadOnlySpan<Byte>) 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 DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) e DecodeFromUtf8InPlace(Span<Byte>, Int32) agora ignoram o espaço em branco na entrada.
Comportamento anterior
Houve falha em Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) e Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) ao processar a entrada que continha espaço em branco e retornava OperationStatus.InvalidData se algum espaço em branco fosse encontrado.
Novo comportamento
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) e Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) agora ignoram o espaço em branco (especificamente ' ', '\t', '\r' e '\n') na entrada, que corresponde ao comportamento de Convert.FromBase64String(String).
Versão introduzida
.NET 8 versão prévia 5
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
A alteração foi feita para que:
- Os métodos Base64 pudessem decodificar uma gama mais ampla de dados de entrada, incluindo:
- Dados produzidos por Convert.ToBase64String com a opção Base64FormattingOptions.InsertLineBreaks.
- Formatação comum de dados em arquivos de configuração e outras fontes de dados reais.
- Os métodos Base64 são consistentes com as APIs de decodificação correspondentes em Convert.
- As novas APIs Base64.IsValid(ReadOnlySpan<Char>) e Base64.IsValid(ReadOnlySpan<Byte>) podem ser adicionadas de uma maneira em que seu comportamento seja consistente entre si e com as APIs Convert e Base64 existentes.
Ação recomendada
Se o novo comportamento for problemático para seu código, você poderá chamar IndexOfAny(" \t\r\n"u8)
para pesquisar a entrada para o espaço em branco que anteriormente teria disparado um resultado InvalidData.
APIs afetadas
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de