- - PR -
MemoryStreamについて
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-04-04 17:25
こんにちは。
某スレッドのために、ファイルを経由しないでXML化、とか、ファイルを経由しないでCryptoとかができるようにと思い、MemoryStreamをいろいろいじっていたのですが・・・ どうもこのMemoryStreamには、8バイト単位でしか書き込みできないようです。8バイト未満の書き込みをすると、バッファには何も書き込まれません。同じ文字列をFileStreamに書き込み、こちらはファイルに書き込まれているのを確認しました。MemoryStreamの方は、デバッガのローカル変数のバッファを覗いてみましたが、何も書き込まれていませんでした。しかし、8バイト渡すと、書き込まれます。7バイト渡してから7バイト渡すと、2度目の書き込みで8バイト分がバッファに入ります。Flushは、MSDNによると、MemoryStreamの書き込み先はRAMであるため機能しない、そうです。しかし、8バイト単位でないと書き込まれない、という記述は見つかりませんでした。 | ||||||||||||
|
投稿日時: 2003-04-04 17:48
まさか。
5バイト書き込まれますよ。どういうコードを試されていますか? | ||||||||||||
|
投稿日時: 2003-04-07 10:00
こんにちは。休日失礼。
わたしも「まさか」と思うのですが・・・(すみません、これはC#で試みています) 下コードで、valueが7文字とすると、エンコーダをUnicodeEncodingだと14バイトになります。このとき8バイト書き込まれます。AsciEncodingだと7バイトになり、ストリームには書き込まれません。CryptoStreamの出力先ストリームにしているので、CryptoStreamをFlushしないといけないのかと思い、加えましたが、出力されません。しかし、MemoryStreamをFileStreamにすると、書き込まれます。
次はサポート技術情報にあるサンプルを、少しいじったものです。
CryptoStreamとMemoryStreamを追加し、オリジナルのFileStreamと同じようにしまうコードを追加しています。同じようにしているつもりですが、FileStreamには7バイトでも書き込まれるのに、MemoryStreamには8の倍数バイトしか書き込まれません。 | ||||||||||||
|
投稿日時: 2003-04-07 10:45
それはMemoryStreamの問題ではありません。FileStreamだと出力されている「ように見える」のは、Closeした後に別の手段で結果を見られるからです。MemoryStreamでも、Closeした後にメモリを確認できれば、結果が書き込まれているはずです。
ICryptoTransform.InputBlockSizeに満たないサイズのブロックを最後に出力したい場合は、crypto.FlushFinalBlock();をすればいいです。 | ||||||||||||
|
投稿日時: 2003-04-07 11:04
DES はブロック暗号では? http://www.wani.net/bak/crypt/blockstr.htm[ メッセージ編集済み 編集者: MMX 編集日時 2003-04-07 11:08 ] | ||||||||||||
|
投稿日時: 2003-04-07 11:19
こんにちは。
はい。それを、「des.Padding = PaddingMode.PKCS7;」で、 「ブロックに足りない分をパディングしてください」と、お願いしています。 | ||||||||||||
|
投稿日時: 2003-04-07 11:50
こんにちは。
なるほど・・・確認しました。どうもありがとうございます。CryptoStreamのFlushは、その他のStreamのFlushと動作が少し違うということですね。MSDNの解説文が難解ですが・・・ ・暗号化/復号するエンコーダにバッファがある ・CryptoStreamにバッファがある ・CryptoStreamが利用するStreamにバッファがある →CryptoStream.FlushFinalBlockは、エンコーダのバッファをCryptoStreamにフラッシュさせる →CryptoStream.Flushは、CryptoStramのバッファ内容をStreamにフラッシュさせる という理解でよろしいでしょうか。 |
1