Pregunta

¿Alguien puede proporcionar alguna luz sobre cómo hacer esto? Puedo hacer esto para texto normal o matriz de bytes, pero no estoy seguro de cómo abordar un pdf. ¿Relleno el pdf en una matriz de bytes primero?

¿Fue útil?

Solución

Use File.ReadAllBytes para cargar el archivo PDF y luego codificar la matriz de bytes de forma normal utilizando Convert.ToBase64String (bytes) .

Otros consejos

Hay una manera de hacer esto en trozos para que no tenga que quemar una tonelada de memoria de una vez.

.Net incluye un codificador que puede hacer la fragmentación, pero está en una especie de lugar extraño. Lo pusieron en el espacio de nombres System.Security.Cryptography.

He probado el código de ejemplo a continuación y obtengo resultados idénticos utilizando mi método o el método de Andrew anterior.

Así es como funciona: activa una clase llamada CryptoStream. Este es un tipo de adaptador que se conecta a otra transmisión. Conecta una clase llamada CryptoTransform en CryptoStream (que a su vez se adjunta a su archivo / memoria / flujo de red) y realiza transformaciones de datos en los datos mientras se leen o escriben en el flujo.

Normalmente, la transformación es encriptación / desencriptación, pero .net incluye también las transformaciones ToBase64 y FromBase64, por lo que no estaremos encriptando, solo codificando.

Aquí está el código. Incluí una implementación (quizás mal nombrada) de la sugerencia de Andrew para que pueda comparar el resultado.


    class Base64Encoder
    {
        public void Encode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.ToBase64Transform();
            using(System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(outFile, transform, System.Security.Cryptography.CryptoStreamMode.Write))
            {
                // I'm going to use a 4k buffer, tune this as needed
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = inFile.Read(buffer, 0, buffer.Length)) > 0)
                    cryptStream.Write(buffer, 0, bytesRead);

                cryptStream.FlushFinalBlock();
            }
        }

        public void Decode(string inFileName, string outFileName)
        {
            System.Security.Cryptography.ICryptoTransform transform = new System.Security.Cryptography.FromBase64Transform();
            using (System.IO.FileStream inFile = System.IO.File.OpenRead(inFileName),
                                      outFile = System.IO.File.Create(outFileName))
            using (System.Security.Cryptography.CryptoStream cryptStream = new System.Security.Cryptography.CryptoStream(inFile, transform, System.Security.Cryptography.CryptoStreamMode.Read))
            {
                byte[] buffer = new byte[4096];
                int bytesRead;

                while ((bytesRead = cryptStream.Read(buffer, 0, buffer.Length)) > 0)
                    outFile.Write(buffer, 0, bytesRead);

                outFile.Flush();
            }
        }

        // this version of Encode pulls everything into memory at once
        // you can compare the output of my Encode method above to the output of this one
        // the output should be identical, but the crytostream version
        // will use way less memory on a large file than this version.
        public void MemoryEncode(string inFileName, string outFileName)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(inFileName);
            System.IO.File.WriteAllText(outFileName, System.Convert.ToBase64String(bytes));
        }
    }

También estoy jugando con donde adjunto el CryptoStream. En el método Encode, lo adjunto a la secuencia de salida (escritura), por lo que cuando instalo el CryptoStream, uso su método Write ().

Cuando leo, lo adjunto al flujo de entrada (lectura), así que uso el método de lectura en CryptoStream. Realmente no importa a qué flujo lo adjunte. Solo tengo que pasar el miembro de enumeración de lectura o escritura apropiado al constructor de CryptoStream.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top