2010-03-26 39 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