2010-03-26 21 views
19

Se voglio produrre un output con codifica Base64, come lo farei in .NET?Esiste un Base64Stream per .NET? dove?

So che dal .NET 2.0, v'è l'interfaccia ICryptoTransform, e le ToBase64Transform() e FromBase64Transform() implementazioni di tale interfaccia.

Ma tali classi sono incorporate nello spazio dei nomi System.Security e richiedono l'utilizzo di TransformBlock, TransformFinalBlock e così via.

C'è un modo più semplice per codificare in base64 un flusso di dati in .NET?

risposta

20

Se si desidera un flusso che si converte in Base64, si può mettere un ToBase64Transform in un CryptoStream:

new CryptoStream(stream, new ToBase64Transform(), CryptoStreamMode.Write) 

Se si desidera convertire solo un array di byte singoli in Base64, è sufficiente chiamare lo Convert.ToBase64String(bytes).

In entrambi i casi, è possibile sostituire la parola To con From.

+1

Sembra facile. È possibile impostare le lunghezze della linea RFC 2045 su quel flusso? – Cheeso

+0

È possibile chiamare 'Convert.ToBase64String (byte, Base64FormattingOptions.InsertLineBreaks)' Tuttavia, 'ToBase64Transform' non espone tale opzione. – SLaks

+0

ok è strano. Quindi, se voglio creare un documento base64 per scopi MIME-attach (a la RFC 2045), allora non posso usarlo, ma se converto DA un doc64 base64, funzionerebbe? – Cheeso

-3

Il CryptoStream non termina le terminazioni di linea RFC2045. Quindi non funzionerà per me.
ToBase64String non è accettabile perché non è un approccio di streaming. Non voglio tenere tutti i dati in memoria in una volta.

Quindi avevo bisogno di alternative.

Richard Grimes ha postato uno qui:
http://www.grimes.nildram.co.uk/workshops/encodedStream.htm

Piuttosto che l'uso che, a causa delle esigenze di licenza e lungometraggi, ho scritto un'implementazione autonoma, disponibile qui:
http://cheeso.members.winisp.net/srcview.aspx?dir=streams&file=Base64Stream.cs

Si è sotto licenza the MS-PL .

Per utilizzare questo per comprimere poi Base64-codificare un file, fare questo:

byte[] working= new byte[1024]; 
int n; 
using (Stream input = File.OpenRead(fileToCompress)) 
{ 
    using (Stream output = new FileStream("file.deflated.b64")) 
    { 
     using (var b64 = new Base64Stream(output, Base64Stream.Mode.Encode)) 
     { 
      b64.Rfc2045Compliant = true; // OutputLineLength = 76; 

      using (var compressor = new DeflateStream(b64, CompressionMode.Compress, true)) 
      { 
       while ((n = input.Read(working, 0, working.Length)) != 0) 
       { 
        compressor.Write(working, 0, n); 
       } 
      } 
     } 
    } 
} 
+1

Non è necessaria una classe di flusso personalizzata; puoi semplicemente usare un 'CryptoStream'. Vedi la mia risposta. – SLaks

+1

sì, ma non riuscivo a capire come eseguire lunghezze di linea conformi a RFC2045 con la classe integrata. Quindi ho * bisogno * di una lezione personalizzata, per quanto ne so. – Cheeso

+0

Hai ragione; la trasformazione integrata non lo fa. – SLaks

0

System.Convert prevede che, ecco un esempio di codice che potrebbe aiutare

private string EncodeBase64(string toEncode) 
    { 
     byte[] toEncodeAsBytes 
      = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode); 
     string returnValue 
      = System.Convert.ToBase64String(toEncodeAsBytes); 
     return returnValue; 
    } 
+1

Utile, ma nel mio caso, non voglio usare ToBase64String. Non è uno stream ed è probabile che non funzioni molto bene con i dati di grandi dimensioni. – Cheeso

Problemi correlati