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

有效而且更简单。