Mengonversi file menjadi Base64String dan kembali lagi

108

Judulnya mengatakan itu semua:

  1. Saya membaca di arsip tar.gz seperti itu
  2. memecah file menjadi array byte
  3. Ubah byte tersebut menjadi string Base64
  4. Ubah string Base64 itu kembali menjadi array byte
  5. Tulis kembali byte tersebut ke file tar.gz baru

Saya dapat mengonfirmasi bahwa kedua file memiliki ukuran yang sama (metode di bawah mengembalikan true) tetapi saya tidak dapat lagi mengekstrak versi salinannya.

Apakah saya melewatkan sesuatu?

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

EDIT: Contoh kerja jauh lebih sederhana (Terima kasih kepada @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);
}

Terima kasih!

darkpbj.dll
sumber
Anda tidak bisa begitu saja mengubah konten file terkompresi seperti itu. Anda harus mendekompresi file pada langkah 1 daripada hanya membacanya secara langsung apa adanya. Dan kemudian langkah 5 juga harus mengompresi ulang data daripada hanya menulis byte secara langsung.
itsme86
Untungnya, karena tidak ada manipulasi sebenarnya dari file itu sendiri (pada dasarnya hanya memindahkannya dari titik A ke B) tugas khusus ini tidak memerlukan kompresi (de /)
darkpbj

Jawaban:

290

Jika Anda ingin karena alasan tertentu mengonversi file Anda ke string base-64. Seperti jika Anda ingin menyebarkannya melalui internet, dll ... Anda bisa melakukannya

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

Dan terkait, baca kembali ke file:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
sumber
Terima kasih atas informasinya, saya mencoba mengikuti jawaban di bawah, tetapi tidak membantu, tetapi ini tampaknya menyelesaikan masalah saya dengan openFileDialog sederhana
Mister SirCode
Bagaimana jika ToBase64String mengembalikan System.OutOfMemoryException? Bagaimana Anda mengoptimalkan untuk file besar dan memori terbatas
Olorunfemi Ajibulu
@OlorunfemiAjibulu maka saya curiga, Anda perlu menggunakan aliran. Atau pecahkan tali menjadi beberapa bagian. Suatu kali saya menulis enkripsi khusus untuk file besar tempat kami menyimpan potongan terenkripsi. Kami menambahkan 4 byte untuk menghemat nilai integer untuk ukuran potongan. Dengan cara ini kami tahu membaca begitu banyak posisi
TS
@TaylorSpark yang menarik. Saya menggunakan sungai dan saya baik-baik saja.
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
sumber
3
Meskipun kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa kode ini memecahkan masalah akan meningkatkan nilai jawaban jangka panjang. Silakan baca cara menjawab ini untuk memberikan jawaban yang berkualitas.
thewaywewere
1
mengapa, sekali lagi, kita perlu javajika OP menggunakan c#?
TS
@ TS kenapa, sekali lagi, kita butuh java?
Klik Ok