我知道如何将简单字符串编码/解码为 base64 。
但是,如果数据已经写入 FileStream 对象,我该怎么做呢?假设我只能访问FileStream对象,而不能访问之前存储的原始数据。在将FileStream刷新到文件之前,如何将 FileStream编码为base64 。
Ofc我可以在将FileStream写入文件之后打开我的文件并对其进行编码/解码,但我想一步一步地完成所有操作,而不是一个接一个地执行两个文件操作。该文件可能更大,并且在刚刚保存一段时间后再加载,编码并再次保存它也需要两倍的时间。
也许有人认识一个更好的解决方案?我可以将FileStream转换为字符串,对字符串进行编码,然后将字符串转换回FileStream,例如,我将做什么以及这样的代码将如何?
答案 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)
由于文件较大,因此您无法选择如何执行此操作。您无法处理该文件,因为这会破坏您需要使用的信息。您可以看到两个选项:
当然,流的重点是避免这种情况。而不是创建内容并将其填充到文件流中,而是将其填充到内存流中。然后对其进行编码,然后保存到磁盘。
答案 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);
在方法开始...;-)