Есть ли Base64Stream для .NET? где?
Если я хочу создать вывод с кодировкой Base64, как мне это сделать в .NET?
Я знаю, что с .NET 2.0 существует ICryptoTransform интерфейс, а
ToBase64Transform() и FromBase64Transform() реализации этого интерфейса.
Но эти классы встроены в пространство имен System.Security и требуют использования TransformBlock, TransformFinalBlock и т.д.
Есть ли более простой способ для base64 кодировать поток данных в .NET?
Ответы
Ответ 1
Если вам нужен поток, который преобразуется в Base64, вы можете поместить a ToBase64Transform
в CryptoStream
:
new CryptoStream(stream, new ToBase64Transform(), CryptoStreamMode.Write)
Если вы просто хотите преобразовать один байт-массив в Base64, вы можете просто вызвать Convert.ToBase64String(bytes)
.
В обоих случаях вы можете заменить слово To
на From
.
Ответ 2
Это должно делать то, что вы ищете:
http://mews.codeplex.com/SourceControl/changeset/view/52969#392973
Ответ 3
System.Convert обеспечивает, что здесь приведен пример кода, который может помочь
private string EncodeBase64(string toEncode)
{
byte[] toEncodeAsBytes
= System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue
= System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}
Ответ 4
Похоже, существует класс Base64Stream
. Возможно, это поможет будущим читателям.
http://referencesource.microsoft.com/#system/net/System/Net/mail/Base64Stream.cs
Ответ 5
CryptoStream не поддерживает окончание строк RFC2045. Поэтому для меня это не сработает.
ToBase64String неприемлемо, потому что это не потоковый подход. Я не хочу хранить все данные в памяти за один раз.
Поэтому мне нужны альтернативы.
Ричард Граймс опубликовал его здесь:
http://www.grimes.nildram.co.uk/workshops/encodedStream.htm
Вместо того, чтобы использовать это, из-за требований лицензирования и функций я написал независимую реализацию, доступную здесь:
http://cheeso.members.winisp.net/srcview.aspx?dir=streams&file=Base64Stream.cs
Лицензируется в MS-PL.
Чтобы использовать это для сжатия, затем base64-encode файл, сделайте следующее:
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);
}
}
}
}
}