如果我想產生一個Base64編碼的輸出,我將如何在.NET中做到這一點?我知道自從.NET 2.0以來,有接口的ICryptoTransform接口,和 和FromBase64Transform()實現該接口。是否有.NET的Base64Stream?哪裏?
但是這些類嵌入到System.Security命名空間中,並且需要使用TransformBlock,TransformFinalBlock等。
有沒有一種更簡單的方法來base64編碼的.NET數據流?
如果我想產生一個Base64編碼的輸出,我將如何在.NET中做到這一點?我知道自從.NET 2.0以來,有接口的ICryptoTransform接口,和 和FromBase64Transform()實現該接口。是否有.NET的Base64Stream?哪裏?
但是這些類嵌入到System.Security命名空間中,並且需要使用TransformBlock,TransformFinalBlock等。
有沒有一種更簡單的方法來base64編碼的.NET數據流?
如果你想要轉換爲Base64編碼流,你可以把一個ToBase64Transform
成CryptoStream
:
new CryptoStream(stream, new ToBase64Transform(), CryptoStreamMode.Write)
如果您只是想將單個字節數組轉換爲Base64,則可以簡單地調用Convert.ToBase64String(bytes)
。
在這兩種情況下,您都可以用From
替換To
這個詞。
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);
}
}
}
}
}
System.Convert規定,這裏是一個代碼示例,可以幫助
private string EncodeBase64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
有用,但在我的情況下,我不想使用ToBase64String。這不是一個流,並可能不適用於大數據。 – Cheeso 2010-03-26 18:03:12
它看起來像有一個Base64Stream
類。也許它會幫助未來的讀者。
http://referencesource.microsoft.com/#system/net/System/Net/mail/Base64Stream.cs
看起來很簡單。您可以在該流上設置RFC 2045行長度嗎? – Cheeso 2010-03-26 18:02:10
您可以調用Convert.ToBase64String(bytes,Base64FormattingOptions.InsertLineBreaks)'但是,ToBase64Transform不公開此選項。 – SLaks 2010-03-26 18:03:03
確實很奇怪。所以,如果我想爲MIME附加目的創建一個base64文檔(la RFC 2045),那麼我不能使用它,但如果我從base64文檔轉換,它會工作? – Cheeso 2010-03-28 22:49:47