Подтвердить что ты не робот

Есть ли Base64Stream для .NET? где?

Если я хочу создать вывод с кодировкой Base64, как мне это сделать в .NET?

Я знаю, что с .NET 2.0 существует ICryptoTransform интерфейс, а ToBase64Transform() и FromBase64Transform() реализации этого интерфейса.

Но эти классы встроены в пространство имен System.Security и требуют использования TransformBlock, TransformFinalBlock и т.д.

Есть ли более простой способ для base64 кодировать поток данных в .NET?

4b9b3361

Ответ 1

Если вам нужен поток, который преобразуется в Base64, вы можете поместить a ToBase64Transform в CryptoStream:

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

Если вы просто хотите преобразовать один байт-массив в Base64, вы можете просто вызвать Convert.ToBase64String(bytes).

В обоих случаях вы можете заменить слово To на From.

Ответ 3

System.Convert обеспечивает, что здесь приведен пример кода, который может помочь

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

Ответ 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);
                }
            }
        }
    }
}