La decodificación Base64 da diferentes resultados en Java y Ruby

Estoy decodificando texto usando Base64. He probado tres bibliotecas diferentes (commons Base64, Java.misc., y también java.mail) en Java y todos ellos producen el mismo resultado para el siguiente texto, lo cual no es correcto.

Sin embargo, cuando uso Ruby para decodificar la siguiente cadena, obtengo una salida diferente. Obtengo el resultado correcto usando Ruby. El código de Ruby es print Base64.decode64('<Below String>'), la cuerda es

RkxWAQEAAAAJAAAAABIAAK4AAAAAAAAAAgAKb25NZXRhRGF0YQgAAAAHAAV3aWR0aABAdAAAAAAA
AAAGaGVpZ2h0AEB0AAAAAAAAAAlmcmFtZXJhdGUAQBAAAAAAAAAADHZpZGVvY29kZWNpZABACAAA
AAAAAAAMY2FuU2Vla1RvRW5kAQEAD21ldGFkYXRhY3JlYXRvcgIAKVNpbXBsZUZMVldyaXRlci5h
cyB2MC44IHplcm9wb2ludG5pbmUuY29tAAAJ

La salida debe comenzar con FLV. No estoy seguro de lo que me falta y por qué el resultado es diferente al usar Java.

preguntado el 16 de mayo de 11 a las 16:05

3 Respuestas

El resultado de decodificar base64 es binario datos. No deberías intentar imprimirlo como si fuera texto.

Sin conocer a Ruby, esperaría el resultado de llamar Base64.decode64 para ser una especie de matriz de bytes ... y que podría convertirse en texto de muchas formas.

Mira el bytes de lo que se devuelve para averiguar si es correcto o no.

(Es una pena que, por lo que puedo ver, el documentación para Base64.decode64 da ejemplos de exactamente el tipo de cosas que está haciendo: tratar el resultado de una operación de decodificación de base64 como texto. No está claro qué tipo de datos son Realmente regresó. Este tipo de cosas es la razón por la que todavía me gustan los lenguajes de tipado estático ...)

contestado el 16 de mayo de 11 a las 20:05

@Jon - Las cadenas de Ruby son secuencias de octetos arbitrarias - McDowell

@McDowell: Entonces, al convertir esos octetos en caracteres en una consola, ¿qué codificación se usa? Parece una mala idea combinar texto y nociones binarias como esta ... - Jon Skeet

Hola Jon, Los datos que estoy tratando de convertir son un archivo de video que estoy enviando desde el cliente. En el lado del servidor, necesito decodificar los datos de Base64 a datos binarios y escribir en el archivo. Obtengo la salida del decodificador Base64 como una matriz de bytes y estoy escribiendo esta matriz de bytes en un archivo. El problema es que el reproductor de video no puede reproducir el video y se queja de que el archivo no comienza con flv. - mono de Fuego

@firemonkey: sospecho que simplemente no es un carácter ASCII, lo que no me sorprende en absoluto. Si toma la suma MD5 tanto del archivo original como del escrito en el disco en el servidor, ¿difieren? - Jon Skeet

@firemonkey: los bytes de Java están firmados; la mayoría de los demás sistemas no están firmados. 174 y -82 son básicamente el mismo valor, por lo que es no es una diferencia. Tendrás que buscar en otra parte ... - Jon Skeet

¿Estás intentando imprimir en texto? que no funcionará, intente usar un ByteArray para almacenar la cadena decodificada.

Ejemplo:

BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(encodedBytes);

contestado el 16 de mayo de 11 a las 21:05

La cadena decodificada en realidad comienza con 'FLV':

require 'base64'
Base64.decode64('RkxWAQEAAAAJAAAAABIAAK4AAAAAAAAAAgAKb25NZXRhRGF0YQgAAAAHAAV3aWR0aABAdAAAAAAA AAAGaGVpZ2h0AEB0AAAAAAAAAAlmcmFtZXJhdGUAQBAAAAAAAAAADHZpZGVvY29kZWNpZABACAAA AAAAAAAMY2FuU2Vla1RvRW5kAQEAD21ldGFkYXRhY3JlYXRvcgIAKVNpbXBsZUZMVldyaXRlci5h cyB2MC44IHplcm9wb2ludG5pbmUuY29tAAAJ')
=> "FLV\001\001\000\000\000\t\000\000\000\000\022\000\000\256\000\000\000\000\000\000\000\002\000\nonMetaData\b\000\000\000\a\000\005width\000@t\000\000\000\000\000\000\000\006height\000@t\000\000\000\000\000\000\000\tframerate\000@\020\000\000\000\000\000\000\000\fvideocodecid\000@\b\000\000\000\000\000\000\000\fcanSeekToEnd\001\001\000\017metadatacreator\002\000)SimpleFLVWriter.as v0.8 zeropointnine.com\000\000\t"

JRuby 1.6.1

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.