c# - online - Base64 String throwing invalid character error
aes/cbc/pkcs5padding java (4)
Sigo recibiendo un error de carácter inválido de Base64 aunque no debería.
El programa toma un archivo XML y lo exporta a un documento. Si el usuario lo desea, comprimirá el archivo también. La compresión funciona bien y devuelve una Cadena Base64 codificada en UTF-8 y escrita en un archivo.
Cuando es hora de volver a cargar el documento en el programa, tengo que comprobar si está comprimido o no, el código es simplemente:
byte[] gzBuffer = System.Convert.FromBase64String(text);
return "1F-8B-08" == BitConverter.ToString(new List<Byte>(gzBuffer).GetRange(4, 3).ToArray());
Comprueba el comienzo de la cadena para ver si tiene el código GZips.
Ahora el problema es que todas mis pruebas funcionan. Tomo una cuerda, la comprime, la descomprimo y la comparo con el original. El problema es cuando obtengo la cadena devuelta desde un conjunto de registros ADO. La cadena es exactamente lo que se escribió en el archivo (con la adición de un "/ 0" al final, pero no creo que, incluso, haga algo, incluso recortarlo). Incluso copio y pegué toda la cadena en un método de prueba y comprimir / descomprimir eso. Funciona bien.
¿Las pruebas pasarán pero el código fallará usando la misma cadena exacta? La única diferencia es que en lugar de simplemente declarar una cadena regular y pasarla, obtengo una devuelta de un conjunto de registros.
¿Alguna idea sobre qué estoy haciendo mal?
Si el carácter nulo está permitido o no realmente depende del códec base64 en cuestión. Dada la vaguedad del estándar Base64 (no existe una especificación exacta autorizada), muchas implementaciones simplemente lo ignorarían como espacio en blanco. Y luego otros pueden señalarlo como un problema. Y los más caprichosos no se darían cuenta y felizmente tratarían de descifrarlo ...: - /
Pero parece que a la implementación de c # no le gusta (que es un enfoque válido), por lo que si eliminarlo ayuda, debería hacerse.
Un pequeño comentario adicional: UTF-8 no es un requisito, ISO-8859-x también conocido como Latin-x, y 7-bit Ascii también funcionaría. Esto porque Base64 fue diseñado específicamente para usar solo un subconjunto de 7 bits que funciona con todas las codificaciones compatibles con ascii de 7 bits.
Si eliminar / 0 del final de la cadena es imposible, puede agregar su propio carácter para cada cadena que codifique y eliminarlo en la decodificación.
Tu dices
La cadena es exactamente lo que se escribió en el archivo (con la adición de un "/ 0" al final, pero no creo que incluso haga nada).
De hecho, hace algo (hace que su código arroje una FormatException
: "Carácter inválido en una cadena Base-64") porque Convert.FromBase64String
no considera que "/ 0" sea un personaje válido de Base64.
byte[] data1 = Convert.FromBase64String("AAAA/0"); // Throws exception
byte[] data2 = Convert.FromBase64String("AAAA"); // Works
Solución: Deshágase de la terminación cero. (Tal vez llame a .Trim("/0")
)
Notas :
Los documentos de MSDN para Convert.FromBase64String
dicen que lanzará una FormatException
cuando
La longitud de s, ignorando los caracteres de espacio en blanco, no es cero o múltiplo de 4.
-o-
El formato de s no es válido. s contiene un carácter no base de 64, más de dos caracteres de relleno o un carácter de espacio no blanco entre los caracteres de relleno.
y eso
Los 64 dígitos básicos en orden ascendente desde cero son los caracteres en mayúscula ''A'' a ''Z'', los caracteres en minúscula ''a'' a ''z'', los números ''0'' a ''9'' y los símbolos ''+'' y ''/'' .
Uno de los puntos a tener en cuenta al convertir Base64 de una cadena es que algunas funciones de conversión usan los "datos: image / jpg; base64" anteriores, y otras solo aceptan los datos reales.