简体   繁体   中英

base64 encode audio file and send as a String then decode the String

I have been stuck on this issue for a few hours now trying to get it working. Basically what I am trying to do is the following. Base64 encode an audio file picked up from an sdcard on an Android device, Base64 encode it, convert it into a String and then decode the String using Base64 again and save the file back to sdcard. It all sounds fairly simple and works great when doing it using a text file. For example if I create a simple text file, call it dave.text and inject some text it in say "Hello Dave" or something similar it works great, but fails when I try doing the same with a binary file, audio in this example. Here's the code that I am using.

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();
}

At this point if I try to save the file, it becomes corrupted. The audio file hello-5.wav is larger in size then the original and it doesn't play.

Any ideas what I am doing wrong here? If I try to save decodedBytes using os.write(decodedBytes) it works but not when converted to a String and getBytes() is used.

Any ideas? Thank You!

You're heavily mixing String s and byte[] s. Don't do that. If you want to encode a byte[] to a String , use Base64.encodeToString() , instead of encoding to bytes and then creating a string.

If I try to save decodedBytes using os.write(decodedBytes) it works but not when converted to a String and getBytes() is used.

Calling new String(byte[]) does not do what you think it does.

Likewise use Base64.decode(String, int) to decode the string.

Something like this (not tested):

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();
}

But why are you base64 encoding an audio file in the first place?

Decoding base64 string file to .m4a file format

try
{
    String audioDataString = "";
    BufferedReader jsonReader = new BufferedReader(new InputStreamReader(this.getResources().openRawResource(R.raw.audioBase64File)));
    StringBuilder jsonBuilder = new StringBuilder();
    for (String line = null; (line = jsonReader.readLine()) != null; ) {
        jsonBuilder.append(line).append("");
    }
    audioDataString = jsonBuilder.toString();
    byte[] decoded = Base64.decode(audioDataString, Base64.DEFAULT);
    try {
        File file2 = new File(Environment.getExternalStorageDirectory() + "/faakhir_testAudio.m4a");
        FileOutputStream os = new FileOutputStream(file2, true);
        os.write(decoded);
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
} catch(Exception e){
    e.printStackTrace();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM