使用c#将FileStream编码为base64

我知道如何编码/解码一个简单的字符串到/从base64

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

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

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

您还可以将字节编码为Base64。 如何从流中获取此信息,请参见此处: 如何在C#中将Stream转换为byte []?

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

你可以尝试这样的事情:

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)); } 

一个简单的扩展方法

 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. 读入整个文件,base64编码,重写编码数据。
  2. 以较小的片段读取文件,随着编码进行编码。 编码到同一目录中的临时文件。 完成后,删除原始文件,然后重命名临时文件。

当然,流的全部意义在于避免这种情况。 而不是创建内容并将其填充到文件流中,而是将其填充到内存流中。 然后编码,然后保存到磁盘。

不要忘记:

 stream.Seek(0, SeekOrigin.Begin); 

在方法的开头… 😉