2011-06-23 21 views
7

He estado atascado en este tema durante unas horas y ahora intento hacerlo funcionar. Básicamente, lo que estoy tratando de hacer es lo siguiente. Base64 codifica un archivo de audio recogido de una tarjeta SD en un dispositivo Android, Base64 lo codifica, lo convierte en una Cadena y luego decodifica la Cadena utilizando Base64 nuevamente y guarda el archivo nuevamente en una tarjeta SD. Todo suena bastante simple y funciona muy bien cuando lo haces usando un archivo de texto. Por ejemplo, si creo un archivo de texto simple, lo llamo dave.text e inyecto un texto en "Hola Dave" o algo similar, funciona bien, pero falla cuando intento hacer lo mismo con un archivo binario, audio en este ejemplo . Aquí está el código que estoy usando.base64 codifica el archivo de audio y lo envía como una Cadena, luego decodifica la Cadena

File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav"); 
byte[] FileBytes = FileUtils.readFileToByteArray(file); 

byte[] encodedBytes = Base64.encode(FileBytes, 0); 
String encodedString = new String(encodedBytes);           
Utilities.log("~~~~~~~~ Encoded: ", new String(encodedString)); 

byte[] decodedBytes = Base64.decode(encodedString, 0); 
String decodedString = new String(decodedBytes); 
Utilities.log("~~~~~~~~ Decoded: ", new String(decodedString)); 

try { 
    File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav"); 
    FileOutputStream os = new FileOutputStream(file2, true); 
    os.write(decodedString.getBytes()); 
    os.flush(); 
    os.close(); 
} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

En este momento, si intento guardar el archivo, se daña. El archivo de audio hello-5.wav es más grande que el original y no se reproduce.

Alguna idea de lo que estoy haciendo mal aquí? Si intento guardar decodedBytes usando os.write (decodedBytes) funciona, pero no cuando se convierte a String y se usa getBytes().

¿Alguna idea? ¡Gracias!

Respuesta

18

Está muy mezclando String sy byte[] s. No hagas eso. Si desea codificar byte[] a String, use Base64.encodeToString(), en lugar de codificar en bytes y , luego creando una cadena.

Si intento para salvar decodedBytes utilizando os.write (decodedBytes) que funciona, pero no cuando se convierte en una cadena y getBytes() se utiliza.

Llamar a new String(byte[]) no hace lo que usted piensa que hace.

Igualmente use Base64.decode(String, int) para decodificar la cadena.

Algo como esto (no probado):

File file = new File(Environment.getExternalStorageDirectory() + "/hello-4.wav"); 
byte[] bytes = FileUtils.readFileToByteArray(file); 

String encoded = Base64.encodeToString(bytes, 0);          
Utilities.log("~~~~~~~~ Encoded: ", encoded); 

byte[] decoded = Base64.decode(encoded, 0); 
Utilities.log("~~~~~~~~ Decoded: ", Arrays.toString(decoded)); 

try 
{ 
    File file2 = new File(Environment.getExternalStorageDirectory() + "/hello-5.wav"); 
    FileOutputStream os = new FileOutputStream(file2, true); 
    os.write(decoded); 
    os.close(); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

Pero ¿por qué la codificación Base64 un archivo de audio en el primer lugar?

+0

Gracias Matt, la solución perfecta. ¡Esto ayudará a muchos, estoy seguro! – ddavtian

+0

Hola Matt, estoy teniendo el mismo problema. lo que sugieres es una forma de escribir un audio. porque lleva mucho tiempo reproducir audio. Primero leo un archivo encriptado, lo descifro y vuelvo a escribir en formato de archivo mp4. – sandy

+0

Me pregunto por qué tú y el operador han usado 'verdadero' en el flujo de salida - 'FileOutputStream (archivo2, verdadero);' De acuerdo con la documentación que escribiría comenzando al final del archivo, supongo que esto no Importa si el archivo de salida aún no existe, o si? Creo que en la publicación original de la operación que podría ser por qué está obteniendo un archivo más grande al menos – Wraithious

Cuestiones relacionadas