Konwersja pliku do Base64String iz powrotem

109

Tytuł mówi wszystko:

  1. Czytałem w takim archiwum tar.gz
  2. rozbić plik na tablicę bajtów
  3. Przekonwertuj te bajty na ciąg Base64
  4. Przekonwertuj ten ciąg Base64 z powrotem na tablicę bajtów
  5. Zapisz te bajty z powrotem do nowego pliku tar.gz

Mogę potwierdzić, że oba pliki mają ten sam rozmiar (poniższa metoda zwraca prawdę), ale nie mogę już wyodrębnić wersji kopii.

Czy coś mi brakuje?

Boolean MyMethod(){
    using (StreamReader sr = new StreamReader("C:\...\file.tar.gz")) {
        String AsString = sr.ReadToEnd();
        byte[] AsBytes = new byte[AsString.Length];
        Buffer.BlockCopy(AsString.ToCharArray(), 0, AsBytes, 0, AsBytes.Length);
        String AsBase64String = Convert.ToBase64String(AsBytes);

        byte[] tempBytes = Convert.FromBase64String(AsBase64String);
        File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);
    }
    FileInfo orig = new FileInfo("C:\...\file.tar.gz");
    FileInfo copy = new FileInfo("C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

EDYCJA: Przykład roboczy jest znacznie prostszy (dzięki @TS):

Boolean MyMethod(){
    byte[] AsBytes = File.ReadAllBytes(@"C:\...\file.tar.gz");
    String AsBase64String = Convert.ToBase64String(AsBytes);

    byte[] tempBytes = Convert.FromBase64String(AsBase64String);
    File.WriteAllBytes(@"C:\...\file_copy.tar.gz", tempBytes);

    FileInfo orig = new FileInfo(@"C:\...\file.tar.gz");
    FileInfo copy = new FileInfo(@"C:\...\file_copy.tar.gz");
    // Confirm that both original and copy file have the same number of bytes
    return (orig.Length) == (copy.Length);
}

Dzięki!

darkpbj
źródło
Nie możesz tak po prostu zmienić zawartości skompresowanego pliku. Będziesz musiał rozpakować plik w kroku 1, zamiast po prostu czytać go bezpośrednio w obecnej postaci. Następnie krok 5 będzie musiał również rekompresować dane zamiast po prostu bezpośrednio wypisywać bajty.
itsme86
Na szczęście, ponieważ nie było rzeczywistej manipulacji samym plikiem (w zasadzie tylko przeniesienie go z punktu A do B), to zadanie nie wymaga żadnej (de /) kompresji
darkpbj

Odpowiedzi:

291

Jeśli z jakiegoś powodu chcesz przekonwertować plik na ciąg base-64. Na przykład, jeśli chcesz to przekazać przez internet, itp ... możesz to zrobić

Byte[] bytes = File.ReadAllBytes("path");
String file = Convert.ToBase64String(bytes);

I odpowiednio przeczytaj z powrotem do pliku:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
źródło
Dziękuję za informacje, próbowałem udzielić odpowiedzi poniżej, ale to nie pomogło, ale wydawało się, że rozwiązało to mój problem za pomocą prostego openFileDialog
Mister SirCode
Co się stanie, jeśli ToBase64String zwróci System.OutOfMemoryException? Jak zoptymalizować pod kątem dużych plików i ograniczonej pamięci
Olorunfemi Ajibulu
@OlorunfemiAjibulu to podejrzewam, że musiałbyś użyć strumieni. Lub podziel strunę na części. Kiedyś napisałem niestandardowe szyfrowanie dla dużych plików, w których zapisywaliśmy zaszyfrowane fragmenty. Dodaliśmy 4 bajty, aby zapisać wartość całkowitą dla rozmiaru fragmentu. W ten sposób wiedzieliśmy, że czytamy tak wiele pozycji
TS
Ciekawe @TaylorSpark. Użyłem strumieni i było dobrze.
Olorunfemi Ajibulu
3
private String encodeFileToBase64Binary(File file){    
String encodedfile = null;  
try {  
    FileInputStream fileInputStreamReader = new FileInputStream(file);  
    byte[] bytes = new byte[(int)file.length()];
    fileInputStreamReader.read(bytes);  
    encodedfile = Base64.encodeBase64(bytes).toString();  
} catch (FileNotFoundException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
} catch (IOException e) {  
    // TODO Auto-generated catch block  
    e.printStackTrace();  
}  
    return encodedfile;  
}
hitesh kumar
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Przeczytaj ten poradnik odpowiedzi, aby udzielić dobrej odpowiedzi.
thewaywewewewewere
1
dlaczego znowu potrzebujemy, javajeśli OP używa c#?
TS,
@TS, dlaczego znowu potrzebujemy Java?
Kliknij OK,