使用 FromBase64Transform 解码 base64 文件流
Decode base64 filestream with FromBase64Transform
MSDN 的example 似乎将整个文件读入内存。我不想要那个。该文件应逐块处理。因此我试图重写这个例子:
using (FromBase64Transform myTransform = new FromBase64Transform (FromBase64TransformMode.IgnoreWhiteSpaces)) {
byte[] transformBuffer = new byte[myTransform.OutputBlockSize];
using (FileStream inputFile = File.OpenRead("/path/to/file/47311.b64")) {
using(FileStream outputFile = File.OpenWrite("/path/to/file/47311.jpg")){
int bytesRead;
byte[] inputBuffer = new byte[4096];
while ((bytesRead = inputFile.Read (inputBuffer, 0, 4096)) > 0) {
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, 4, transformBuffer, 0);
outputFile.Write (transformBuffer, 0, bytesWritten);
}
myTransform.Clear ();
}
}
}
但是图片打不开。我做错了什么?
我认为这一行是错误:
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, 4, transformBuffer, 0);
无论您读取了多少字节,您都在转换 4 个字节。我怀疑你想要:
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, bytesRead, transformBuffer, 0);
尽管如此,您可能需要更改 transformBuffer
的大小 - 如果每次迭代读取多达 4K 的 base64 数据,则每次迭代最多需要 3K 的纯文本数据。
然而,更简单的选择可能是使用转换创建 CryptoStream
,从输入流读取,然后使用 Stream.CopyTo
写入 FileStream
。
现在我尝试了 Jon 提到的 CryptoStream
:
using (FileStream inputFile = File.OpenRead ("/your/path/file.b64"))
using (FileStream outputFile = File.OpenWrite("/your/path/test.jpg"))
using (FromBase64Transform myTransform = new FromBase64Transform (FromBase64TransformMode.IgnoreWhiteSpaces))
using (CryptoStream cryptoStream = new CryptoStream(inputFile, myTransform, CryptoStreamMode.Read))
{
cryptoStream.CopyTo (outputFile, 4096);
}
有效而且更简单。
MSDN 的example 似乎将整个文件读入内存。我不想要那个。该文件应逐块处理。因此我试图重写这个例子:
using (FromBase64Transform myTransform = new FromBase64Transform (FromBase64TransformMode.IgnoreWhiteSpaces)) {
byte[] transformBuffer = new byte[myTransform.OutputBlockSize];
using (FileStream inputFile = File.OpenRead("/path/to/file/47311.b64")) {
using(FileStream outputFile = File.OpenWrite("/path/to/file/47311.jpg")){
int bytesRead;
byte[] inputBuffer = new byte[4096];
while ((bytesRead = inputFile.Read (inputBuffer, 0, 4096)) > 0) {
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, 4, transformBuffer, 0);
outputFile.Write (transformBuffer, 0, bytesWritten);
}
myTransform.Clear ();
}
}
}
但是图片打不开。我做错了什么?
我认为这一行是错误:
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, 4, transformBuffer, 0);
无论您读取了多少字节,您都在转换 4 个字节。我怀疑你想要:
int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, bytesRead, transformBuffer, 0);
尽管如此,您可能需要更改 transformBuffer
的大小 - 如果每次迭代读取多达 4K 的 base64 数据,则每次迭代最多需要 3K 的纯文本数据。
然而,更简单的选择可能是使用转换创建 CryptoStream
,从输入流读取,然后使用 Stream.CopyTo
写入 FileStream
。
现在我尝试了 Jon 提到的 CryptoStream
:
using (FileStream inputFile = File.OpenRead ("/your/path/file.b64"))
using (FileStream outputFile = File.OpenWrite("/your/path/test.jpg"))
using (FromBase64Transform myTransform = new FromBase64Transform (FromBase64TransformMode.IgnoreWhiteSpaces))
using (CryptoStream cryptoStream = new CryptoStream(inputFile, myTransform, CryptoStreamMode.Read))
{
cryptoStream.CopyTo (outputFile, 4096);
}
有效而且更简单。