- - PR -
文字列の比較で矛盾が生じます。
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-05-11 18:47
環境 XP VB2005エクスプレス
文字列の比較で Dim UserName As String = Me.TXTUserName.Text Dim decstr As String ーーーーーーーーーーーーーーー UserNameを暗号化して、複合化する処理 decstr =複合化した文字列 ーーーーーーーーーーーーーーーーー Dim a As String Dim b As String a = UserName b = decstr パターン1 Select Case a.CompareTo(b) Case 0 MessageBox.Show("a" & " と " & "b" & " は等しい") Case Is > 0 MessageBox.Show("a" & " の方が大きい") Case Is < 0 MessageBox.Show("b" & " の方が大きい") End Select パターン2 If a = b Then MessageBox.Show("等しい") Else MessageBox.Show("等しくない") End If 以上のコードを実行すると パターン1では、等しいになるが、パターン2では等しくないという結果になってしまいます。 原因は何がいけないのでしょうか? よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2007-05-11 19:02
UserName と decstr の中身がわからないと何にも言えないよ…と思っ
たのですが、そうでもないですね。 String.CompareTo メソッド(microsoft.com) を読むとこんなことが 書いてあります。
なので、パターン1はカルチャを考慮した比較になっています。 えーと簡単な例で言うと
は 0 になりますが
だと false を返します。 カルチャとか Equals メソッドのオーバーロード(こっちは難しいかな?)に ついて調べてみると良いでしょうね。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||
|
投稿日時: 2007-05-11 19:26
うおお!濁点か!気が付かなかった。 私も「現在のカルチャを使用して…」だと思って色々試したんですけど、同じ文字列じゃないのにCompareTo()がTrueになる組み合わせが見つかりませんでした。 「デバッガで止めてUserNameとdecstrをメモ帳に貼り付けて比較してみてください」とかアドバイスする所でした。 | ||||||||||||
|
投稿日時: 2007-05-11 19:43
実は私も
"ぁ".CompareTo("あ") とか "ゐ".CompareTo("い") とか試してみてました か゛ の話は、(手前味噌になりますが)先日のわんくま同盟の勉強会で中 博俊さんがお話しされていたのを思い出したのでした。 # 書いてから「ほ゜」にすればよかったあああぁぁ!と思ったのは秘密。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||
|
投稿日時: 2007-05-11 20:08
お早いお返事頂きありがとうございます。
先ほどのコードは、 TXTUserName.Textに入力された文字列を暗号化し、復号化した 文字列を当初のTXTUserName.Text同じになっているのを確認 するためです。 現状、わかりやすいように先ほどのコードの後ろに、 TextBox1.Text = a & System.Environment.NewLine & b と追加しました。 TextBox1は新たに追加いたしました。 そして、 TXTUserName.Textにaaaと入力し、実行した結果をコピーして貼り付けます。 aaa aaa です。スペースは含まれていませんでした。 結果は先ほどと同じく、 パターン1では、等しいになるが、パターン2では等しくないという結果になってしまいます。 | ||||||||||||
|
投稿日時: 2007-05-11 21:02
うーん、そこまで行ってしまうと、さすがに中身がわからないと何とも言えな
いですねえ。 で、その「中身」を知っているのはフィーバーさんしかいないのですね。 見た目では全然違いがないということなので、次に取る手段としては、復 号化された段階でブレークポイントを設定してデバッガで本当に1バイトも 違いがないのかどうか、を調べることでしょうか。 スペースが含まれていないとは言え、スペース以外に何か見えない文字 が含まれている可能性も否定できないと思います(例えばコード00とか)。 それを探れるのはフィーバーさん自身だけですので、そういった感じで調べ てみてください。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||||||||||
|
投稿日時: 2007-05-11 21:41
TextBox だなんだは省いたらどうでしょうか?
暗号化復号化の処理を省いたらどうでしょうか? 最小コードから始めていかないと問題が何かわかりませんよ。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2007-05-12 16:33
ブレークポイントの設定をしてみましたが、1バイト単位での見方がわかりませんでした。
ローカルっていう所で問題と思われる所を発見いたしました。 例 文字列 a 暗号化前:"a" 復号化後:"a のように"a"の最後の"が付いていませんでした。 暗号化・復号化の処理は、検索して見つけたコードを少し改良した程度のものです。 http://msdn2.microsoft.com/ja-jp/library/system.security.cryptography.rijndaelmanaged(vs.80).aspx ここのサンプルで紹介されているコードの最後に If original = roundtrip Then MessageBox.Show("等しい") Else MessageBox.Show("等しくない") End If を追加して実行してみましたが、等しくないになってしまいます。 暗号化すると、見た目ではわからなくても、完全には復号できないものなのでしょうか? よろしくお願いいたします。 |
1|2|3
次のページへ»