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);
}
}
}
}
}
Sembra facile. È possibile impostare le lunghezze della linea RFC 2045 su quel flusso? – Cheeso
È possibile chiamare 'Convert.ToBase64String (byte, Base64FormattingOptions.InsertLineBreaks)' Tuttavia, 'ToBase64Transform' non espone tale opzione. – SLaks
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