2015-05-08 3 views
2

example из MSDN, кажется, считывает весь файл в память. Я не хочу этого. Файл должен обрабатываться по блоку. Поэтому я попытался переписать пример:Decode base64 filestream with FromBase64Transform

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

Но изображение не может быть открыто. Что я делаю неправильно?

+0

У вас есть исходный файл? Вы сравнили это с декодированным файлом? –

+0

Да, и он отличается. – testing

ответ

2

Я считаю, что эта линия является ошибка:

int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, 4, transformBuffer, 0); 

Вы преобразуя 4 байта, независимо от того, сколько байтов вы читали. Я подозреваю, что вы хотите:

int bytesWritten = myTransform.TransformBlock (inputBuffer, 0, bytesRead, transformBuffer, 0); 

Вам может понадобиться изменить размер transformBuffer, хотя - если вы читаете до 4K данных base64 на итерацию, необходимо до 3К для открытого текста данных за итерацию.

Простейшим вариантом, однако, было бы, вероятно, создание CryptoStream с использованием преобразования, чтение из входного потока, а затем с использованием Stream.CopyTo для записи в FileStream.

+0

Ты потрясающий. Теперь он работает с адаптациями, которые вы сказали. Я посмотрю на «CryptoStream». Благодаря! – testing

1

Теперь я попробовал 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); 
} 

Это работает, и это проще.