Conversión de archivo a Base64String y viceversa

108

El título lo dice todo:

  1. Leí en un archivo tar.gz así
  2. dividir el archivo en una matriz de bytes
  3. Convierta esos bytes en una cadena Base64
  4. Convierta esa cadena Base64 nuevamente en una matriz de bytes
  5. Vuelva a escribir esos bytes en un nuevo archivo tar.gz

Puedo confirmar que ambos archivos tienen el mismo tamaño (el método a continuación devuelve verdadero) pero ya no puedo extraer la versión de copia.

¿Me estoy perdiendo de algo?

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

EDITAR: El ejemplo de trabajo es mucho más simple (gracias 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);
}

¡Gracias!

darkpbj
fuente
No puede simplemente cambiar el contenido de un archivo comprimido como ese. Tendrá que descomprimir el archivo en el paso 1 en lugar de leerlo directamente como está. Y luego el paso 5 también tendrá que recomprimir los datos en lugar de simplemente escribir los bytes directamente.
itsme86
Afortunadamente, como no hubo manipulación real del archivo en sí (básicamente, simplemente moviéndolo del punto A al B), esta tarea en particular no requiere ninguna compresión (de /)
darkpbj

Respuestas:

289

Si por alguna razón desea convertir su archivo a una cadena base-64. Como si quisieras pasarlo a través de Internet, etc ... puedes hacer esto

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

Y, en consecuencia, vuelva a leer el archivo:

Byte[] bytes = Convert.FromBase64String(b64Str);
File.WriteAllBytes(path, bytes);
TS
fuente
Gracias por la información, intenté seguir la respuesta a continuación, pero no ayudó, pero esto pareció resolver mi problema con un simple openFileDialog
Mister SirCode
¿Qué pasa si ToBase64String devuelve System.OutOfMemoryException? ¿Cómo se optimiza para archivos grandes y memoria limitada?
Olorunfemi Ajibulu
@OlorunfemiAjibulu entonces sospecho que necesitarías usar streams. O romper la cuerda en partes. Una vez escribí cifrado personalizado para archivos grandes donde guardamos fragmentos cifrados. Agregamos 4 bytes para guardar el valor entero para el tamaño del fragmento. De esta manera supimos leer tantas posiciones
TS
Interesante @TaylorSpark. Usé streams y estaba bien.
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
fuente
3
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo. Lea este manual de instrucciones para brindar una respuesta de calidad.
thewaywewere
1
¿Por qué, nuevamente, necesitamos javasi OP usa c#?
TS
@TS ¿por qué, de nuevo, necesitamos Java?
Haga clic en Aceptar