DOBON.NET DOBON.NETプログラミング掲示板過去ログ

[報告].NET Tipsのサンプルに問題

環境/言語:[VB.NET 2002 SP1 .NET Framework 1.0 SP3]
分類:[.NET]

対象
 http://dobon.net/vb/dotnet/string/encryptfile.html(ファイルを暗号化する)
内容
 必ず暗号化に失敗する。
詳細
 暗号化時にファイルの最後に必ずNULLが入り、
 復号化したファイルの容量が元のファイルより1バイト大きくなる。

復号化したファイル容量が増えているため、
最初は復号化部分に問題があるのだと考えましたが、
別のツールを使用して暗号化したファイルは問題なく復号化できたため、
暗号化部分に問題があることが分かりました。

プログラムには問題はなさそうなので、おそらく.NET Frameworkのバグです。
使用している暗号化方式(DES)の仕様ではありません。
暗号化部分(EncryptFile)の、

'すべて読み込む
Dim bytesIn(fsIn.Length) As Byte
fsIn.Read(bytesIn, 0, bytesIn.Length)

を、

'すべて読み込む
Dim bytesIn(fsIn.Length - 1) As Byte
fsIn.Read(bytesIn, 0, bytesIn.Length)

または、

'すべて読み込む
Dim bytesIn(fsIn.Length) As Byte
fsIn.Read(bytesIn, 0, bytesIn.Length - 1)

と書き換えることで対策することができます。

当方VB.NET 2002にてこの現象を確認しましたので、
.NET FrameworkのバグならC#でも発生するはずですが、
VB.NET 2003でも発生するのかなど、他の方の声と、
管理人様へTipsの修正をお願いしたく、掲示板に書き込ませていただきました。

問題としては復号化されたファイルの最後にNULLが1バイト入るだけであり、
このままの状態でも復号化されたMP3やJPEGファイルの再生に特に問題はなく、
それほど大きな問題ではないのかもしれませんが、一応よろしくお願いします。
> プログラムには問題はなさそうなので、おそらく.NET Frameworkのバグです。

 プログラムの問題だと思いますよ。

 こちらのサンプルの冒頭には
> C#のコードを'C# to VB.NET Translator'で変換し、修正したコードです
という記述がありますよね。修正漏れの箇所があったということではないでしょうか。
#'C# to VB.NET Translator'で変換したとき、配列のサイズ指定は正しく変換されません。
#このことは次の Tips 内でも触れられています。

C#のコードをVB.NETへ変換する
http://dobon.net/vb/dotnet/links/convertcs2vb.html


> 当方VB.NET 2002にてこの現象を確認しましたので、
> .NET FrameworkのバグならC#でも発生するはずですが、
> VB.NET 2003でも発生するのかなど、他の方の声と、
> 管理人様へTipsの修正をお願いしたく、掲示板に書き込ませていただきました。

 ということなので、検証が必要な内容ではないかと。
 でも、サンプルの修正は必要ですよね。報告ありがとうございます。
#一利用者としてお礼を言っても良いですよね? ;)
>プログラムの問題だと思いますよ。

私はCに関しては一応少し理解できる(普段あまり扱わないので)というレベルなのですが、
たしか、配列は、BASICとCで同じようにa(10)やa[10]と宣言しても、
BASICはa(0)〜a(10)まで、Cはa[0]〜a[9]までになるんでしたよね。
C#のほうのサンプルプログラムを見ていなかったのと、
この配列の違いをたまたま忘れていたので深山さんに言われるまで気づきませんでしたが、
これだと明らかにVBのほうは希望より1バイト分大きくなりますし、多分これが原因ですね。

>ということなので、検証が必要な内容ではないかと。
>でも、サンプルの修正は必要ですよね。報告ありがとうございます。

他のTipsもすべて確認した訳ではありませんが、
もし他のTipsもすべて同じように未確認のままサンプルを掲載しているのなら、
配列を使っているサンプルは同じようなバグが出てくる可能性がありますので、
すべてのTipsの見直しが必要になってくるかもしれません。
多めに宣言してしまっていても無意味に多めに宣言しているというだけで、
動作にはまったく問題はないサンプルのほうが多いかもしれませんが。

#本件とまったく関係ないけど、ときどき書き込み回数が一般人(1回)に戻るのはなぜだろう。
#ときどき行うスパイウェア検索のときにこの掲示板用のクッキーも消えてしまうのか、
#サーバの仕様で長期間書き込まないと書き込み回数の情報が削除されてしまうのか・・・
ご報告ありがとうございました。次の機会に修正したいと思います。

> これだと明らかにVBのほうは希望より1バイト分大きくなりますし、多分これが原因ですね。

気をつけているつもりなのですが、気がつかないときもたまにあります。

> 他のTipsもすべて確認した訳ではありませんが、
> もし他のTipsもすべて同じように未確認のままサンプルを掲載しているのなら、
> 配列を使っているサンプルは同じようなバグが出てくる可能性がありますので、
> すべてのTipsの見直しが必要になってくるかもしれません。

まずは、.NET Tipsの「説明と注意事項」をご覧ください。

私としてはすべてのコードの完全なチェックは難しいというのが現状ですので、インターネットで公開されているという強みを生かして、皆様からのご報告をいただければと思っています。

> #本件とまったく関係ないけど、ときどき書き込み回数が一般人(1回)に戻るのはなぜだろう。

「発言ランク」をご覧ください。
> 気をつけているつもりなのですが、気がつかないときもたまにあります。
>
> 私としてはすべてのコードの完全なチェックは難しいというのが現状ですので、インターネットで公開されているという強みを生かして、皆様からのご報告をいただければと思っています。

Tipsは数も多いので間違えがないよう徹底することはむずかしいと思いますし、
私も別に「完璧にしろ」とか「公開前のチェックを徹底しろ」だなんて言いません。
あちこち間違えだらけだという訳ではありませんし、
私も「報告があれば修正」ということで問題ないと思います。

最初の報告時点ではなぜNULLが入るのか気づいていなかったので、
環境によって発生しない場合もあるような場合、
Tipsを変更することはむずかしいかもしれないと思い、
一応検証をお願いするような文面で書き込みをしました。

> 「発言ランク」をご覧ください。

180日間(約半年)書き込まないとリセットされるんですね。
(そんなに長期間書き込まなかっただろうか・・・)
たしかに全員分のカウントをとっておくと大変なことになりますし、仕方ないですね。
覚えておきます。
解決済み!
>>「発言ランク」をご覧ください。
>
> 180日間(約半年)書き込まないとリセットされるんですね。
> (そんなに長期間書き込まなかっただろうか・・・)

もともとは30日でしたが、リクエストがあったため、日にちを延ばしました。詳しくは、「お気楽掲示板」にあります。

DOBON.NET | プログラミング道 | プログラミング掲示板