2015-05-10 5 views
4

У меня есть зашифрованный файл, который я расшифрован первым, а затем попытаться десериализациями его с помощью memorystream и binaryformatter, но когда я пытаюсь присвоить десериализованные файлы в список Ловля OutOfMemoryException (файл действительно мало - 17KB) здесь это коднебольшого файл причина OutOfMemoryException

byte[] encryptedData = File.ReadAllBytes(fileName); 
byte[] result = Decrypt(Algo, key, vector, encryptedData) ; 
BinaryFormatter ser = new BinaryFormatter(); 
using (MemoryStream ms = new MemoryStream(result)) { 
try { 
    files = ser.Deserialize(ms) as List<IItem>; 
    } catch (OutOfMemoryException) { 

    } catch (SerializationException) { 
    MessageBox.Show("Incorrect password!"); 
    return; 
    } 
} 

files = ser.Deserialize(ms) as List<IItem>; - это то, что причина исключения зашифрован размером файла 1696 после дешифрования 1691 - нормального размера. здесь дешифрование код

public byte[] Decode(byte[] data) 
    { 
     string key = ASCIIEncoding.ASCII.GetString(rc2.Key); 
     string IV = ASCIIEncoding.ASCII.GetString(rc2.IV); 
     ICryptoTransform decryptor = rc2.CreateDecryptor(rc2.Key,rc2.IV); 
     StringBuilder roundtrip = new StringBuilder(); 
     using (MemoryStream msDecrypt = new MemoryStream(data)) 
     { 
      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
      { 
       int b = 0; 

       do 
       { 
        b = csDecrypt.ReadByte(); 

        if (b != -1) 
        { 
         roundtrip.Append((char) b); 
        } 
       } while (b != -1); 
      } 
     } 
     byte[] decrypted = ASCIIEncoding.ASCII.GetBytes(roundtrip.ToString()); 
     return decrypted; 
    } 
+0

Каково потребление памяти вашего приложения в момент выброса «OutofMemoryException»? И в какой среде вы находитесь? Мобильное приложение или рабочий стол? x86 или x64? –

+0

около 12-13MB. enviroment MVS, desktop app, x86 – KofHein

+0

Можете ли вы распечатать 'ms.Length' (или проверить его в отладчике)? Сначала десериализуйте объект, а затем посмотрите на фактический тип в отладчике (тип мыши и вид, или в часах, используйте функцию variable.GetType()). –

ответ

0

@MineR и @HansPassant правильно проблема была в использовании символов при расшифровке)) я изменил мой код

 public byte[] Decode(byte[] data) 
    { 
     ICryptoTransform decryptor = rc2.CreateDecryptor(rc2.Key,rc2.IV); 
     byte[] decrypted = new byte[data.Length]; 
     using (MemoryStream msDecrypt = new MemoryStream(data)) 
     { 
      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
      { 
       csDecrypt.Read(decrypted, 0, data.Length); 
      } 
     } 
     return decrypted; 
    } 

и теперь он работает. Thx все для ответов.

Смежные вопросы