Dosyayı Base64String'e ve tekrar geri dönüştürme


109

Başlık her şeyi söylüyor:

  1. Tar.gz arşivinde böyle okudum
  2. dosyayı bir bayt dizisine böl
  3. Bu baytları bir Base64 dizesine dönüştürün
  4. Bu Base64 dizesini bayt dizisine geri dönüştürün
  5. Bu baytları yeni bir tar.gz dosyasına geri yazın

Her iki dosyanın da aynı boyutta olduğunu onaylayabilirim (aşağıdaki yöntem true değerini döndürür) ancak artık kopya sürümünü çıkaramıyorum.

Bir şey mi kaçırıyorum?

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

DÜZENLEME: Çalışma örneği çok daha basit (@TS sayesinde):

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

Teşekkürler!


Böyle sıkıştırılmış bir dosyanın içeriğini öylece değiştiremezsiniz. Doğrudan olduğu gibi okumak yerine 1. adımda dosyayı açmanız gerekecek. Ve sonra 5. adımın da aynı şekilde baytları doğrudan yazmak yerine verileri yeniden sıkıştırması gerekecektir.
itsme86

Neyse ki, dosyanın kendisinin gerçek bir manipülasyonu olmadığından (temelde sadece onu A noktasından B noktasına taşımak) bu özel görev herhangi bir (de /) sıkıştırma gerektirmez
darkpbj

Yanıtlar:


291

Herhangi bir nedenle dosyanızı taban 64 dizesine dönüştürmek istiyorsanız. Mesela internet üzerinden iletmek istersen, bunu yapabilirsin

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

Ve buna bağlı olarak, dosyaya geri okuyun:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);

Bilgi için teşekkür ederim, aşağıdaki cevaba uymaya çalıştım, ancak yardımcı olmadı, ancak bu sorunumu basit bir openFileDialog ile çözmüş gibiydi
Mister SirCode

ToBase64String System.OutOfMemoryException döndürürse ne olur? Büyük dosyalar ve sınırlı bellek için nasıl optimize edersiniz
Olorunfemi Ajibulu

@OlorunfemiAjibulu o zaman şüpheleniyorum, akışları kullanmanız gerekir. Veya dizeyi parçalara ayırın. Bir keresinde, şifrelenmiş parçaları kaydettiğimiz büyük dosyalar için özel şifreleme yazdım. Parça boyutu için tamsayı değerini kaydetmek için 4 bayt ekledik. Böylelikle pek çok pozisyonu okuyacağımızı biliyorduk
TS

İlginç @TaylorSpark. Akarsu kullandım ve iyiydim.
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;  
}

3
Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır. Kaliteli bir yanıt sağlamak için lütfen bu nasıl yanıtlanacağını okuyun.
thewaywewere

1
javaOP kullanıyorsa neden yine ihtiyacımız var c#?
TS

@TS Neden java'ya ihtiyacımız var?
Tamam'ı tıklayın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.