- PR -

文字列の比較で矛盾が生じます。

投稿者投稿内容
フィーバー
常連さん
会議室デビュー日: 2006/08/30
投稿数: 22
投稿日時: 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では等しくないという結果になってしまいます。
原因は何がいけないのでしょうか?
よろしくお願いいたします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-05-11 19:02
UserName と decstr の中身がわからないと何にも言えないよ…と思っ
たのですが、そうでもないですね。

String.CompareTo メソッド(microsoft.com) を読むとこんなことが
書いてあります。

引用:

このメソッドは、現在のカルチャを使用して、単語 (大文字/小文字を区別し、カルチャに依存した) 比較を実行します。単語、文字列、序数の並べ替えの詳細については、「System.Globalization.CompareOptions」を参照してください。


なので、パターン1はカルチャを考慮した比較になっています。

えーと簡単な例で言うと

コード:

"か゛".CompareTo("が")


は 0 になりますが

コード:

"か゛" = "が"


だと false を返します。

カルチャとか Equals メソッドのオーバーロード(こっちは難しいかな?)に
ついて調べてみると良いでしょうね。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-05-11 19:26
引用:

ぽぴ王子さんの書き込み (2007-05-11 19:02) より:
"か゛".CompareTo("が")



うおお!濁点か!気が付かなかった。

私も「現在のカルチャを使用して…」だと思って色々試したんですけど、同じ文字列じゃないのにCompareTo()がTrueになる組み合わせが見つかりませんでした。

「デバッガで止めてUserNameとdecstrをメモ帳に貼り付けて比較してみてください」とかアドバイスする所でした。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-05-11 19:43
実は私も

"ぁ".CompareTo("あ")
とか
"ゐ".CompareTo("い")
とか試してみてました

か゛ の話は、(手前味噌になりますが)先日のわんくま同盟の勉強会で中
博俊さんがお話しされていたのを思い出したのでした。

# 書いてから「ほ゜」にすればよかったあああぁぁ!と思ったのは秘密。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
フィーバー
常連さん
会議室デビュー日: 2006/08/30
投稿数: 22
投稿日時: 2007-05-11 20:08
お早いお返事頂きありがとうございます。
先ほどのコードは、

TXTUserName.Textに入力された文字列を暗号化し、復号化した
文字列を当初のTXTUserName.Text同じになっているのを確認
するためです。

現状、わかりやすいように先ほどのコードの後ろに、
TextBox1.Text = a & System.Environment.NewLine & b
と追加しました。
TextBox1は新たに追加いたしました。
そして、
 TXTUserName.Textにaaaと入力し、実行した結果をコピーして貼り付けます。
aaa
aaa
です。スペースは含まれていませんでした。
結果は先ほどと同じく、
パターン1では、等しいになるが、パターン2では等しくないという結果になってしまいます。

ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-05-11 21:02
うーん、そこまで行ってしまうと、さすがに中身がわからないと何とも言えな
いですねえ。
で、その「中身」を知っているのはフィーバーさんしかいないのですね。

見た目では全然違いがないということなので、次に取る手段としては、復
号化された段階でブレークポイントを設定してデバッガで本当に1バイトも
違いがないのかどうか、を調べることでしょうか。
スペースが含まれていないとは言え、スペース以外に何か見えない文字
が含まれている可能性も否定できないと思います(例えばコード00とか)。

それを探れるのはフィーバーさん自身だけですので、そういった感じで調べ
てみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-05-11 21:41
TextBox だなんだは省いたらどうでしょうか?
暗号化復号化の処理を省いたらどうでしょうか?
最小コードから始めていかないと問題が何かわかりませんよ。
_________________
囚人のジレンマな日々
フィーバー
常連さん
会議室デビュー日: 2006/08/30
投稿数: 22
投稿日時: 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
を追加して実行してみましたが、等しくないになってしまいます。

暗号化すると、見た目ではわからなくても、完全には復号できないものなのでしょうか?

よろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)