2011-06-23 12 views
7

Utknąłem w tej kwestii przez kilka godzin, próbując uruchomić. Zasadniczo to, co próbuję zrobić, jest następujące. Base64 koduje plik audio pobrany z sdcard na urządzeniu z Androidem, zakodowuje go w Base64, przekształca w String, a następnie dekoduje String za pomocą Base64 i ponownie zapisuje plik z powrotem na sdcard. To wszystko brzmi dość proste i działa świetnie, robiąc to za pomocą pliku tekstowego. Na przykład, jeśli utworzę prosty plik tekstowy, nazwij go dave.text i wpisz trochę tekstu w "Hello Dave" lub coś podobnego, działa świetnie, ale zawiedzie, gdy próbuję zrobić to samo z plikiem binarnym, audio w tym przykładzie . Oto kod, którego używam.kodowanie pliku base64 i wysyłanie jako String, a następnie dekodowanie String

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

W tym momencie, jeśli spróbuję zapisać plik, zostanie uszkodzony. Plik audio hello-5.wav ma większy rozmiar niż oryginał i nie jest odtwarzany.

Jakieś pomysły, co robię źle tutaj? Jeśli spróbuję zapisać dekodowane bajty za pomocą os.write (decodedBytes), to działa, ale nie po przekonwertowaniu na ciąg i użycie getBytes().

Wszelkie pomysły? Dziękuję Ci!

Odpowiedz

18

Intensywnie mieszasz ze sobą String s i byte[] s. Nie rób tego. Jeśli chcesz zakodować byte[] na String, użyj Base64.encodeToString(), zamiast kodowania do bajtów i , a następnie, tworząc ciąg znaków.

Jeśli próbuję zapisać dekodowane bajty za pomocą os.write (dekodowane bajty), to działa, ale nie po przekonwertowaniu na ciąg i użycie getBytes().

Wywołanie new String(byte[]) nie robi tego, co myślisz.

Podobnie, należy użyć Base64.decode(String, int) do dekodowania ciągu znaków.

Coś takiego (nie testowane):

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

Ale dlaczego base64 kodowania pliku audio w pierwszej kolejności?

+0

Dziękuję Matt, idealne rozwiązanie. Pomoże to wielu, jestem pewien! – ddavtian

+0

Cześć Matt, mam ten sam problem. To, co sugerujesz, jest sposobem zapisu dźwięku. bcoz trwa długo nagrywanie dźwięku. Najpierw odczytam zaszyfrowany plik, a następnie odszyfruję go i zapisuję ponownie w formacie MP4. – sandy

+0

Zastanawiam się, dlaczego ty i op użyliście 'true' w strumieniu wyjściowym - 'FileOutputStream (file2, true);' Według dokumentacji to byłoby napisane na końcu pliku, myślę, że to nie ważne czy plik wyjściowy jeszcze nie istnieje, czy nie? Wydaje mi się, że w oryginalnym poście op jest to, że dostaje większy plik co najmniej – Wraithious

Powiązane problemy