2010-03-26 37 views
19

如果我想产生一个Base64编码的输出,我将如何在.NET中做到这一点?我知道自从.NET 2.0以来,有接口的ICryptoTransform接口,和 和FromBase64Transform()实现该接口。是否有.NET的Base64Stream?哪里?

但是这些类嵌入到System.Security命名空间中,并且需要使用TransformBlock,TransformFinalBlock等。

有没有一种更简单的方法来base64编码的.NET数据流?

回答

20

如果你想要转换为Base64编码流,你可以把一个ToBase64TransformCryptoStream

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

如果您只是想将单个字节数组转换为Base64,则可以简单地调用Convert.ToBase64String(bytes)

在这两种情况下,您都可以用From替换To这个词。

+1

看起来很简单。您可以在该流上设置RFC 2045行长度吗? – Cheeso 2010-03-26 18:02:10

+0

您可以调用Convert.ToBase64String(bytes,Base64FormattingOptions.InsertLineBreaks)'但是,ToBase64Transform不公开此选项。 – SLaks 2010-03-26 18:03:03

+0

确实很奇怪。所以,如果我想为MIME附加目的创建一个base64文档(la RFC 2045),那么我不能使用它,但如果我从base64文档转换,它会工作? – Cheeso 2010-03-28 22:49:47

-3

CryptoStream不执行RFC2045行结束。所以这对我不起作用。
ToBase64String是不可接受的,因为它不是流式方法。我不想一次将所有数据保存在内存中。

因此,我需要替代品。

理查德·格里姆斯发布一个位置:
http://www.grimes.nildram.co.uk/workshops/encodedStream.htm

而不是使用的是,因为许可和功能的需求,我写了一个独立的实现,可在这里:
http://cheeso.members.winisp.net/srcview.aspx?dir=streams&file=Base64Stream.cs

the MS-PL下许可。

以此来压缩,然后采用base64编码文件,这样做:

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

你不需要自定义流类;你可以使用'CryptoStream'。看到我的答案。 – SLaks 2010-03-26 17:57:08

+1

是的,但我无法弄清楚如何使用内置类来执行符合RFC2045的行长度。据我所知,所以我*需要一个自定义类。 – Cheeso 2011-04-04 17:54:43

+0

你是对的;内置的转换不会这样做。 – SLaks 2011-04-04 17:59:51

0

System.Convert规定,这里是一个代码示例,可以帮助

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

有用,但在我的情况下,我不想使用ToBase64String。这不是一个流,并可能不适用于大数据。 – Cheeso 2010-03-26 18:03:12