Pergunta

alguém pode fornecer alguma luz sobre como fazer isso? Eu posso fazer isso para o texto regular ou matriz de bytes, mas não sabe como se aproximar para um pdf. faço para encher o pdf em um array de bytes em primeiro lugar?

Foi útil?

Solução

Use File.ReadAllBytes para carregar o PDF arquivo, e, em seguida, codificar a matriz de bytes como normal usando Convert.ToBase64String(bytes) .

Outras dicas

Há uma maneira que você pode fazer isso em pedaços de modo que você não tem que queimar uma tonelada de memória de uma vez.

Net inclui um codificador que pode fazer o chunking, mas é no tipo de um lugar estranho. Eles colocá-lo no espaço de nomes System.Security.Cryptography.

Eu testei o código de exemplo abaixo, e eu recebo saída idêntica usando o meu método ou método de Andrew acima.

Eis como funciona: Você fogo até uma classe chamada de CryptoStream. Este é o tipo de um adaptador que se liga a um outro fluxo. Você conecta uma classe chamada CryptoTransform no CryptoStream (que por sua vez está ligado ao seu arquivo / memória / fluxo de rede) e realiza transformações de dados sobre os dados enquanto ele está sendo lido ou gravado para o fluxo.

Normalmente, a transformação é encriptação / desencriptação, mas .net inclui ToBase64 e FromBase64 transformações bem, por isso não será criptografar, apenas a codificação.

Aqui está o código. Eu incluí uma implementação (talvez mal chamado) da sugestão de Andrew para que você possa comparar a saída.


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

Eu também estou brincando com onde eu anexar o CryptoStream. No método Encode, estou anexando-lo para o fluxo de saída (escrita), então quando eu exemplo, o CryptoStream, eu uso a sua Write () método.

Quando eu li, eu estou anexando-o à entrada (leitura) de fluxo, então eu uso o método de leitura no CryptoStream. Realmente não importa qual fluxo de I anexá-lo a. Eu só tenho que passar a ler ou escrever enumeração membro apropriado ao construtor da CryptoStream.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top