Conversione del file in Base64String e ritorno


108

Il titolo dice tutto:

  1. Ho letto in un archivio tar.gz in questo modo
  2. spezza il file in un array di byte
  3. Converti quei byte in una stringa Base64
  4. Converti quella stringa Base64 di nuovo in un array di byte
  5. Riscrivi quei byte in un nuovo file tar.gz

Posso confermare che entrambi i file hanno la stessa dimensione (il metodo seguente restituisce true) ma non posso più estrarre la versione di copia.

Mi sto perdendo qualcosa?

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: L'esempio di lavoro è molto più semplice (grazie a @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);
}

Grazie!


Non puoi semplicemente modificare il contenuto di un file compresso in questo modo. Dovrai decomprimere il file nel passaggio 1 invece di leggerlo direttamente così com'è. E poi il passaggio 5 dovrà anche ricomprimere i dati invece di scrivere direttamente i byte.
itsme86

Fortunatamente, poiché non vi è stata alcuna manipolazione effettiva del file stesso (fondamentalmente solo spostandolo dal punto A al punto B) questa particolare attività non richiede alcuna compressione (de /)
darkpbj

Risposte:


288

Se per qualche motivo vuoi convertire il tuo file in una stringa di base 64. Ad esempio, se vuoi passarlo via Internet, ecc ... puoi farlo

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

E di conseguenza, rileggi nel file:

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

Grazie per le informazioni, ho provato ad andare avanti con la risposta di seguito, ma non è stato d'aiuto, ma questo sembrava risolvere il mio problema con un semplice openFileDialog
Mister SirCode

Cosa succede se ToBase64String restituisce System.OutOfMemoryException? Come ottimizzare per file di grandi dimensioni e memoria limitata
Olorunfemi Ajibulu

@OlorunfemiAjibulu quindi sospetto, dovresti usare i flussi. O spezza la corda in parti. Una volta ho scritto una crittografia personalizzata per file di grandi dimensioni in cui abbiamo salvato blocchi crittografati. Abbiamo aggiunto 4 byte per salvare il valore intero per la dimensione del blocco. In questo modo sapevamo di leggere così tante posizioni
TS

Interessante @TaylorSpark. Ho usato gli stream e stavo bene.
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
Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo su come e / o perché risolve il problema migliorerebbe il valore a lungo termine della risposta. Si prega di leggere questo how-to-risposta per la fornitura di risposta di qualità.
thewaywere

1
perché, ancora una volta, abbiamo bisogno javase OP usa c#?
TS

@TS perché, ancora una volta, abbiamo bisogno di java?
Fare clic su Ok
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.