Archiv
Ansicht:   
Suche   erweiterte Suche

Nachricht aus dem Archiv

glitzi schrieb am 10.February.2009, 15:37:09 in der Kategorie pc.coding

vb.net: MemoryStream vergisst Bytes

Hallo zusammen,

ich bin grad dabei ein Programm mit VB.net 2005 zu schreiben. Ich habe ein Structure definiert, welches meine ganzen Einstellungen aufnimmt. Dieses möchte ich nun zuerst serialisieren und dann verschlüsselt in eine Datei speichern. Das Abspeichern funktioniert auch ganz gut, nur das auslesen tut aus irgend einem Grund nicht.

Hier mal der relevante Codeauszug:

Public Function loadSettings() As Boolean
   Dim fr As New System.IO.FileStream(setFile, IO.FileMode.Open)
   memStream = New IO.MemoryStream
   encoder.EncryptOrDecryptStream(memStream, fr, clsEnc.CryptoAction.ActionDecrypt)
   memStream.Position = 0
   settings = CType(formatter.Deserialize(memStream), setStruct)
   fr.Close()
   memStream.Dispose()
End Function


encoder ist eine Instanz meiner Crypto-Klasse (clsEnc). settings ist eine Instanz des Structure und formatter ist eine Instanz des BinaryFormatters.

Und hier die dazugehörige Klassenfunktion:

Public Sub EncryptOrDecryptStream(ByRef outStream As Stream, ByVal inStream As Stream, ByVal Direction As CryptoAction)
   Dim bytBuffer(4096) As Byte \'holds a block of bytes for processing
   Dim lngBytesProcessed As Long = 0 \'running count of bytes processed
   Dim lngStreamLength As Long = inStream.Length \'the input stream\'s length
   Dim intBytesInCurrentBlock As Integer \'current bytes being processed
   Dim csCryptoStream As CryptoStream
   Dim cspRijndael As New System.Security.Cryptography.RijndaelManaged
   Select Case Direction
       Case CryptoAction.ActionEncrypt
           csCryptoStream = New CryptoStream(outStream, _
           cspRijndael.CreateEncryptor(CreateKey(password), CreateIV(password)), _
          CryptoStreamMode.Write)

       Case CryptoAction.ActionDecrypt
           csCryptoStream = New CryptoStream(outStream, _
           cspRijndael.CreateDecryptor(CreateKey(password), CreateIV(password)), _
           CryptoStreamMode.Write)

       Case Else
           Exit Sub
   End Select
   inStream.Position = 0
   While lngBytesProcessed < lngStreamLength
       intBytesInCurrentBlock = inStream.Read(bytBuffer, 0, 4096)
       csCryptoStream.Write(bytBuffer, 0, intBytesInCurrentBlock)
       lngBytesProcessed = lngBytesProcessed + CLng(intBytesInCurrentBlock)
   End While
End Sub



Die Save-Funktion sieht gleich aus wie die Load-Funktion, nur halt andersrum. Jetzt das seltsame Verhalten:

Beim speichern werden durch die Serialisierung 410 Byte im MemoryStream abgelegt. In der While-Schleife werden dann aus inStream (MemoryStream) auch 410 Byte gelesen und in bytBuffer abgelegt. intBytesInCurrentBlock ist dann ebenfalls 410. Nach dem Schreibprozess in den CryptoStream sind aber im Ausgabestrom nur 400 Byte enthalten.
Wenn das Programm neu gestartet wird, dann wird die obige loadSettings-Funktion ausgeführt. Er liest dann korrekt 400 Byte aus der Datei, schreibt aber lediglich 384 Byte in den Ausgabestrom. Beim deserialisieren kommt dann natürlich diese Fehlermeldung:

End of Stream encountered before parsing was completed.



Jemand ne Idee wo die Bytes bleiben?

mfg glitzi

  • vb.net: MemoryStream vergisst Bytes glitzi - 10.February.2009, 15:37:09 - (pc.coding)
    • Gelöst! glitzi - 10.February.2009, 21:53:33
Archiv
Ansicht:   
Suche   erweiterte Suche
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz