使用c#将FileStream编码为base64

时间:2013-10-02 09:42:00

标签: c# string file base64 filestream

我知道如何将简单字符串编码/解码为 base64

但是,如果数据已经写入 FileStream 对象,我该怎么做呢?假设我只能访问FileStream对象,而不能访问之前存储的原始数据。在将FileStream刷新到文件之前,如何将 FileStream编码为base64

Ofc我可以在将FileStream写入文件之后打开我的文件并对其进行编码/解码,但我想一步一步地完成所有操作,而不是一个接一个地执行两个文件操作。该文件可能更大,并且在刚刚保存一段时间后再加载,编码并再次保存它也需要两倍的时间。

也许有人认识一个更好的解决方案?我可以将FileStream转换为字符串,对字符串进行编码,然后将字符串转换回FileStream,例如,我将做什么以及这样的代码将如何?

7 个答案:

答案 0 :(得分:16)

作为扩展方法的简单方法

public static class Extensions
{
    public static Stream ConvertToBase64(this Stream stream)
    {
        byte[] bytes;
        using (var memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            bytes = memoryStream.ToArray();
        }

        string base64 = Convert.ToBase64String(bytes);
        return new MemoryStream(Encoding.UTF8.GetBytes(base64));
    }
}

答案 1 :(得分:15)

你可以尝试喜欢

    public Stream ConvertToBase64(Stream stream)
    {
        Byte[] inArray = new Byte[(int)stream.Length];
        Char[] outArray = new Char[(int)(stream.Length * 1.34)];
        stream.Read(inArray, 0, (int)stream.Length);
        Convert.ToBase64CharArray(inArray, 0, inArray.Length, outArray, 0);
        return new MemoryStream(Encoding.UTF8.GetBytes(outArray));
    }

答案 2 :(得分:11)

您还可以将字节编码为Base64。如何从流中获取此信息,请参阅此处:How to convert an Stream into a byte[] in C#?

或者我认为也应该使用.ToString()方法并对其进行编码。

答案 3 :(得分:7)

一种简单的Stream扩展方法可以完成这项工作:

public static class StreamExtensions
{
    public static string ConvertToBase64(this Stream stream)
    {
        var bytes = new Byte[(int)stream.Length];

        stream.Seek(0, SeekOrigin.Begin);
        stream.Read(bytes, 0, (int)stream.Length);

        return Convert.ToBase64String(bytes);
    }
}

用于读取(以及写入)并针对相应类(无论是文件流,内存流等)进行优化的方法,这些方法将为您完成工作。对于像这样的简单任务,不需要读者等。

唯一的缺点是将流复制到字节数组中,但是不幸的是,通过Convert.ToBase64String转换为base64的方式如此。

答案 4 :(得分:5)

由于文件较大,因此您无法选择如何执行此操作。您无法处理该文件,因为这会破坏您需要使用的信息。您可以看到两个选项:

  1. 读入整个文件,base64编码,重写编码数据。
  2. 以较小的片段阅读文件,随时进行编码。编码到同一目录中的临时文件。完成后,删除原始文件,并重命名临时文件。
  3. 当然,流的重点是避免这种情况。而不是创建内容并将其填充到文件流中,而是将其填充到内存流中。然后对其进行编码,然后保存到磁盘。

答案 5 :(得分:3)

在处理大数据流时,例如文件大小超过4GB的文件,您不希望将文件加载到内存中(作为Byte[],因为它不仅速度很慢,而且还可能导致崩溃因为即使在64位进程中,Byte[]也不能超过2GB(对于gcAllowVeryLargeObjects,则不能超过4GB)。

幸运的是,.NET中有一个名为ToBase64Transform的简洁帮助程序,它可以分块处理流。出于某种原因,Microsoft将其放在System.Security.Cryptography中,并实现了ICryptoTransform(与CryptoStream配合使用),但是忽略了它(“其他名称的玫瑰...”),只是因为您没有执行任何低温任务。

您将其与CryptoStream一起使用,如下所示:

using System.Security.Cryptography;
using System.IO;

//

using( FileStream   inputFile    = new FileStream( @"C:\VeryLargeFile.bin", FileMode.Open, FileAccess.Read ) )
using( CryptoStream base64Stream = new CryptoStream( inputFile, new ToBase64Transform(), CryptoStreamMode.Read ) )
using( FileStream   outputFile   = new FileStream( @"C:\VeryLargeBase64File.txt", FileMode.CreateNew, FileAccess.Write ) )
{
    await base64Stream.CopyToAsync( outputFile ).ConfigureAwait(false);
}

答案 6 :(得分:0)

不要忘记:

stream.Seek(0, SeekOrigin.Begin);

在方法开始...;-)

相关问题