Java base64编码音频文件并作为字符串发送,然后解码该字符串

Java base64编码音频文件并作为字符串发送,然后解码该字符串,java,android,Java,Android,我已经在这个问题上纠缠了几个小时了,现在正努力让它工作。基本上我想做的是以下几点。Base64编码从Android设备上的SD卡上拾取的音频文件,Base64编码,将其转换为字符串,然后再次使用Base64解码字符串,并将文件保存回SD卡。这一切听起来相当简单,在使用文本文件时效果非常好。例如,如果我创建了一个简单的文本文件,将其命名为dave.text,并将一些文本插入到say“Hello dave”或类似的内容中,效果很好,但在本例中,当我尝试对二进制文件(音频)执行相同操作时失败。这是我正

我已经在这个问题上纠缠了几个小时了,现在正努力让它工作。基本上我想做的是以下几点。Base64编码从Android设备上的SD卡上拾取的音频文件,Base64编码,将其转换为字符串,然后再次使用Base64解码字符串,并将文件保存回SD卡。这一切听起来相当简单,在使用文本文件时效果非常好。例如,如果我创建了一个简单的文本文件,将其命名为dave.text,并将一些文本插入到say“Hello dave”或类似的内容中,效果很好,但在本例中,当我尝试对二进制文件(音频)执行相同操作时失败。这是我正在使用的代码

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();
}
在这一点上,如果我试图保存文件,它就会损坏。音频文件hello-5.wav比原始文件大,无法播放

你知道我做错了什么吗?如果我尝试使用os.write(decodedBytes)保存decodedBytes,它会工作,但在转换为字符串并使用getBytes()时不会工作


有什么想法吗?谢谢大家!

您将
字符串
s和
字节[]
s严重混合。不要那样做。如果要将
字节[]
编码为
字符串
,请使用,而不是编码为字节,然后创建字符串

如果我尝试使用os.write(decodedBytes)保存decodedBytes,它会工作,但在转换为字符串并使用getBytes()时不会工作

打电话并不是你想象的那样

同样,也可以使用来解码字符串

类似这样的内容(未测试):

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


但是为什么要首先对音频文件进行base64编码?

将base64字符串文件解码为.m4a文件格式

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

谢谢你,马特,完美的解决方案。我相信这会帮助很多人!!嗨,马特,我也有同样的问题。你建议这是一种播放音频的书面方式。bcoz播放音频需要很长时间。首先,我读取加密文件,然后解密,再写回mp4文件格式。我想知道为什么您和op在输出流中使用“true”-
FileOutputStream(file2,true)
根据文档,这将从文件末尾开始编写,我想如果输出文件还不存在,或者是否存在,这并不重要?我认为在op的原始帖子中,这可能就是为什么他在least@Wraithious你必须问OP:我只是修改了现有的代码。