glitzi schrieb am 10.February.2009, 15:37:09 in der Kategorie pc.coding
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