Konvertieren der Datei in Base64String und wieder zurück

108

Der Titel sagt alles:

  1. Ich habe so in einem tar.gz-Archiv gelesen
  2. Teilen Sie die Datei in ein Array von Bytes auf
  3. Konvertieren Sie diese Bytes in eine Base64-Zeichenfolge
  4. Konvertieren Sie diese Base64-Zeichenfolge zurück in ein Array von Bytes
  5. Schreiben Sie diese Bytes zurück in eine neue tar.gz-Datei

Ich kann bestätigen, dass beide Dateien dieselbe Größe haben (die folgende Methode gibt true zurück), aber ich kann die Kopierversion nicht mehr extrahieren.

Vermisse ich etwas

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: Das Arbeitsbeispiel ist viel einfacher (Dank an @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);
}

Vielen Dank!

darkpbj
quelle
Sie können den Inhalt einer komprimierten Datei nicht einfach so ändern. Sie müssen die Datei in Schritt 1 dekomprimieren, anstatt sie direkt wie sie ist direkt einzulesen. Und dann muss Schritt 5 ebenfalls die Daten erneut komprimieren, anstatt nur die Bytes direkt zu schreiben.
itsme86
Glücklicherweise erfordert diese spezielle Aufgabe keine (De /) Komprimierung, da die Datei selbst nicht manipuliert wurde (im Grunde genommen nur von Punkt A nach B
verschoben

Antworten:

288

Wenn Sie aus irgendeinem Grund Ihre Datei in eine Base-64-Zeichenfolge konvertieren möchten. Wenn Sie es über das Internet weitergeben möchten, können Sie dies tun

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

Lesen Sie dementsprechend die Datei zurück:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
quelle
Vielen Dank für die Informationen, ich habe versucht, der Antwort unten zu folgen, aber es hat nicht geholfen, aber dies schien mein Problem mit einem einfachen openFileDialog
Mister SirCode
Was ist, wenn ToBase64String System.OutOfMemoryException zurückgibt? Wie optimieren Sie für große Dateien und begrenzten Speicher
Olorunfemi Ajibulu
@OlorunfemiAjibulu dann vermute ich, du müsstest Streams verwenden. Oder brechen Sie die Schnur in Teile. Einmal habe ich eine benutzerdefinierte Verschlüsselung für große Dateien geschrieben, in der wir verschlüsselte Chunks gespeichert haben. Wir haben 4 Bytes hinzugefügt, um einen ganzzahligen Wert für die Blockgröße zu speichern. Auf diese Weise konnten wir so viele Positionen lesen
TS
Interessanter @TaylorSpark. Ich habe Streams benutzt und mir ging es gut.
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
quelle
3
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und / oder warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern. Bitte lesen Sie diese Anleitung, um eine qualitativ hochwertige Antwort zu erhalten.
thewaywewere
1
Warum brauchen wir wieder, javawenn OP verwendet c#?
TS
@TS warum brauchen wir wieder Java?
Klicken Sie auf Ok