Conversion de fichier en Base64String et vice-versa

108

Le titre dit tout:

  1. J'ai lu dans une archive tar.gz comme ça
  2. diviser le fichier en un tableau d'octets
  3. Convertissez ces octets en une chaîne Base64
  4. Reconvertissez cette chaîne Base64 en un tableau d'octets
  5. Réécrivez ces octets dans un nouveau fichier tar.gz

Je peux confirmer que les deux fichiers ont la même taille (la méthode ci-dessous renvoie true) mais je ne peux plus extraire la version de copie.

Est-ce que je manque quelque chose?

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'exemple de travail est beaucoup plus simple (Merci à @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);
}

Merci!

darkpbj
la source
Vous ne pouvez pas simplement changer le contenu d'un fichier compressé comme ça. Vous devrez décompresser le fichier à l'étape 1 au lieu de simplement le lire directement tel quel. Et puis l'étape 5 devra également recompresser les données au lieu de simplement écrire directement les octets.
itsme86
Heureusement, comme il n'y a pas eu de manipulation réelle du fichier lui-même (simplement en le déplaçant du point A au point B), cette tâche particulière ne nécessite aucune (dé /) compression
darkpbj

Réponses:

290

Si vous souhaitez, pour une raison quelconque, convertir votre fichier en chaîne de base 64. Comme si vous voulez le transmettre via Internet, etc ... vous pouvez le faire

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

Et en conséquence, relisez le fichier:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
la source
Merci pour l'information, j'ai essayé de suivre la réponse ci-dessous, mais cela n'a pas aidé, mais cela semblait résoudre mon problème avec un simple openFileDialog
Mister SirCode
Que faire si ToBase64String renvoie System.OutOfMemoryException? Comment optimiser les fichiers volumineux et la mémoire limitée
Olorunfemi Ajibulu
@OlorunfemiAjibulu alors je suppose que vous auriez besoin d'utiliser des flux. Ou divisez la corde en plusieurs parties. Une fois, j'ai écrit un chiffrement personnalisé pour les gros fichiers où nous avons enregistré des morceaux chiffrés. Nous avons ajouté 4 octets pour enregistrer la valeur entière de la taille du morceau. De cette façon, nous savions lire autant de positions
TS
Intéressant @TaylorSpark. J'ai utilisé des streams et ça allait.
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
la source
3
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la façon et / ou pourquoi il résout le problème améliorerait la valeur à long terme de la réponse. Veuillez lire cette réponse pratique pour fournir une réponse de qualité.
thewaywewere
1
pourquoi, encore une fois, avons-nous besoin javasi OP utilise c#?
TS
@TS pourquoi, encore une fois, avons-nous besoin de Java?
Cliquez Ok