misc.log

日常茶飯事とお仕事と

ストリームとフラッシュ

暗号化されたXMLファイルを復号し、メモリストリーム経由でデシリアライザに渡すという処理を書こうとして、どうもうまくいかない。ファイルをストリームに読み込んだ時点では448バイトなのだが、復号ストリームを通すと440バイトになる。念のため、出てきたMemoryStreamをStreamReaderに読み込ませてテキストに書き出すと、やはり最後の数文字が切れている。なんで?

Dim sourceBytes(CInt(fileIn.Length) - 1) As Byte
'ファイル格納バイトにファイル情報を格納する
fileIn.Read(sourceBytes, 0, sourceBytes.Length)

'その他変数定義
Dim encDES As DESCryptoServiceProvider = SetUpCrypt()
Dim encStream As New CryptoStream(memoryOut, encDES.CreateDecryptor, CryptoStreamMode.Write)

'ファイルを読み込んで、復号して出力する
encStream.Write(sourceBytes, 0, sourceBytes.Length)
encStream.FlushFinalBlock()

Return memoryOut

答えは、読み出しブロックサイズ未満の読み残しがストリームに残っていた、だったようだ。http://www.microsoft.com/japan/msdn/vbasic/migration/tips/SecretKeyCryptosystem/ をみて、FlushFinalBlockの存在に気づく。早速やってみる。うまくいった。ソースは上記の通り。