Los métodos Base64.DecodeFromUtf8 omiten el espacio en blanco
Los métodos Convert.FromBase64String(String) y Convert.FromBase64CharArray(Char[], Int32, Int32), y los métodos Try
correspondientes en System.Convert, omiten los caracteres ASCII de espacio en blanco " ", "\t", "\r" y "\n", y permiten que haya cualquier cantidad de espacios en blanco en la entrada. Sin embargo, cuando se agregaban los métodos Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) y Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32), no omitían los caracteres de espacio en blanco y no podían descodificar ninguna entrada que incluyera espacios en blanco. Esto hacía que el comportamiento de las API basadas en UTF16 fuera diferente al de las API basadas en UTF8. Esto también conllevaba lo siguiente:
- Los métodos
Base64.DecodeFromUtf8
yBase64.DecodeFromUtf8InPlace
no podían realizar un recorrido de ida y vuelta de los datos codificados en base 64 con codificación UTF que Convert.FromBase64String(String) generaba con la opción Base64FormattingOptions.InsertLineBreaks. - Los nuevos métodos IsValid(ReadOnlySpan<Char>) y IsValid(ReadOnlySpan<Byte>) se veían obligados a tener un comportamiento incoherente entre sí o incoherente con sus métodos correspondientes para los datos UTF-16 y UTF-8 en Convert y Base64.
Con este cambio, los métodos DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) y DecodeFromUtf8InPlace(Span<Byte>, Int32) ahora omiten el espacio en blanco en la entrada.
Comportamiento anterior
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) y Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) no podían procesar una entrada que contuviese espacios en blanco y devolvían OperationStatus.InvalidData si se detectaba algún espacio en blanco.
Comportamiento nuevo
Base64.DecodeFromUtf8(ReadOnlySpan<Byte>, Span<Byte>, Int32, Int32, Boolean) y Base64.DecodeFromUtf8InPlace(Span<Byte>, Int32) ahora omiten el espacio en blanco (más concretamente, " ", "\t", "\r" y "\n") en la entrada, lo que coincide con el comportamiento de Convert.FromBase64String(String).
Versión introducida
.NET 8 (versión preliminar 5)
Tipo de cambio importante
Este es un cambio de comportamiento.
Motivo del cambio
El cambio se ha realizado para conseguir lo siguiente:
- Los métodos Base64 pueden descodificar una gama más amplia de datos de entrada, entre los que se incluyen:
- Los datos que genera Convert.ToBase64String con la opción Base64FormattingOptions.InsertLineBreaks.
- El formato común de datos en archivos de configuración y otros orígenes de datos reales.
- Los métodos Base64 son coherentes con las API de descodificación correspondientes en Convert.
- Las nuevas API Base64.IsValid(ReadOnlySpan<Char>) y Base64.IsValid(ReadOnlySpan<Byte>) se pueden agregar de manera que su comportamiento sea coherente entre sí y con las API Convert y Base64 existentes.
Acción recomendada
Si el nuevo comportamiento es problemático para el código, puede llamar a IndexOfAny(" \t\r\n"u8)
para buscar en la entrada el espacio en blanco que anteriormente habría desencadenado un resultado InvalidData.