2010-03-26 12 views
19

Si quiero producir una salida codificada en Base64, ¿cómo haré eso en .NET?¿Hay un Base64Stream para .NET? ¿dónde?

sé que desde .NET 2.0, existe la interfaz ICryptoTransform, y los ToBase64Transform() y FromBase64Transform() implementaciones de la interfaz.

Pero esas clases están incrustadas en el espacio de nombres System.Security y requieren el uso de un TransformBlock, TransformFinalBlock, y así sucesivamente.

¿Hay una manera más fácil de base64 de codificar una secuencia de datos en .NET?

Respuesta

20

Si desea una corriente que se convierte en base 64, se puede poner un ToBase64Transform en un CryptoStream:

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

Si solo desea convertir una matriz de un solo byte a Base64, simplemente puede llamar al Convert.ToBase64String(bytes).

En ambos casos, puede reemplazar la palabra To con From.

+1

Parece fácil. ¿Puedes establecer longitudes de línea RFC 2045 en esa secuencia? – Cheeso

+0

Puede llamar a 'Convert.ToBase64String (bytes, Base64FormattingOptions.InsertLineBreaks)' Sin embargo, 'ToBase64Transform' no expone esa opción. – SLaks

+0

ok eso es extraño. Entonces, si quiero crear un documento base64 para fines de vinculación MIME (a la RFC 2045), entonces no puedo usar eso, pero si convierto desde un documento base64, ¿funcionaría? – Cheeso

-3

El CryptoStream no hace terminaciones de línea RFC2045. Por lo tanto, eso no funcionará para mí.
El ToBase64String es inaceptable porque no es un enfoque de transmisión. No quiero mantener todos los datos en la memoria al mismo tiempo.

Por lo tanto, necesitaba alternativas.

Richard Grimes registró una aquí:
http://www.grimes.nildram.co.uk/workshops/encodedStream.htm

En lugar de usar que, debido a las necesidades de licencias y de características, escribí una aplicación independiente, disponible aquí:
http://cheeso.members.winisp.net/srcview.aspx?dir=streams&file=Base64Stream.cs

Está bajo licencia de the MS-PL .

Para utilizar esta base 64 para comprimir entonces a codificar un archivo, haga lo siguiente:

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

No necesita una clase de secuencia personalizada; solo puedes usar un 'CryptoStream'. Ver mi respuesta – SLaks

+1

sí, pero no pude entender cómo hacer longitudes de línea compatibles con RFC2045 con la clase integrada. Así que * necesitaba * una clase personalizada, que yo sepa. – Cheeso

+0

Tienes razón; la transformación incorporada no hace eso. – SLaks

0

System.Convert establece que, aquí es un ejemplo de código que podría ayudar

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

Útil, pero en mi caso, no quiero usar el ToBase64String. No es una transmisión y es probable que no funcione muy bien con datos de gran tamaño. – Cheeso

Cuestiones relacionadas