環境はWindowsXP VisualStudio2003 です。
Dim mozibyte As Byte() = Encoding.Unicode.GetBytes("kensakudate")
Dim bs As Byte() = Encoding.Unicode.GetBytes("ckensakudatecccckensakudatessss")
と文字列をバイト型にした後、一番後方のkensakudateの位置を探しそこから
最後までのバイト配列を抜き出そうと思ってます。
今回はkensakudatessssです。
Dim i As Integer = bs.Length
Dim ii As Integer = mozibyte.Length - 1
While i > 0
i = i - 1
If mozibyte(ii) = bs(i) Then
' MessageBox.Show(i.ToString() & " " & ii.ToString())
ii = ii - 1
If ii = 0 Then
'ここの処理がよくわかりません。
Dim str As String = Encoding.Unicode.GetString(bss)
MessageBox.Show(str & " " & str.Length)
Exit While
End If
Else
i = i + (mozibyte.Length - ii) - 1
ii = mozibyte.Length - 1
End If
End While
後方から検索していって、MessageBox.Show(str & " " & str.Length)で
kensakudatessssを表示するつもりです。
ヒントなど教えていただければ幸いです。
よろしくお願いします。
後方から文字列検査して、検索結果の位置から文字列として終端まで取ってくるのがいいのでは?
画像などにバイト型にして引っ付けた文字列をもう一回分解するために
バイト型で後ろから、文字列と同じ情報をさがす練習してます。
>'ここの処理がよくわかりません。
何かの問題みたいだなw
もし、そこだけに入れるとしたら。
検索文字列が見つかった場合のみ実行されるのだから
検索文字列をbssに代入すれば良いだけでは?
テスト問題でなければ
Dim str As String = Encoding.Unicode.GetString(bss)
bssをmozibyteに変えるとかで良いのでは?
レスありがとうございます。
bssってのはkensakudatessssがバイト型の配列で入ってる状態をイメージでしてました。
kensakudatessssの最初の文字位置は何バイト目かわかってるのにそこから
抜き出せなくてとまってます。
ここの処理がわかりません。
の部分ではbyte配列の部分抽出をしてbssに入れる処理を考えてます。
文章べたや説明不足でレスがしづらくてすいません。
ういさんへ
>kensakudatessssの最初の文字位置は何バイト目かわかってるのにそこから
>抜き出せなくてとまってます。
最初の文字から抜き出そうとするから、難しくなるのかな?
検索文字を配列に最後から順次格納していけばよいのでは?
ま、どちらでも同じです。
Dim bss(mozibyte.Length - 1) as byte
bss(ii) = bs(i)
あと、このプログラムだと最後(最初ii=0)のバイトが検索されていませんよ。
ここまで、プログラム組めるのですから、配列の中身を見比べる等をして
自分で問題を解決する力を付けましょう。
抜き出すのなら、
For I = 開始 to 終了
bss(I-開始) = bs(i)
Next I
こんな感じかな
ういさんへ
System.BitConverter.ToString(bs) →「63-00-6B-00-65-00・・・・・」
バイト配列を文字列に変換してInstr()で
検索する方法もありますよ。
お試しください。
VB梅さんへ
ご丁寧なご返事ありがとうございます。
おかげで検索周辺の文字列がメッセージボックスに表示されあと一歩というところまできております。
文字列にできることでより検索が簡単そうです。
その方法も試してみます。
ありがとうございます。
Array.LastIndexOf()メソッドとか使えないのかな…
あと、文字列照合法はいろいろあるので、十分な速度が得られない場合はググってみてください(BM法とか)
希望した文字列が抜き出せるようになりました。
'ここの処理がわかりません。 が解決したのを載せます。
Dim mozibyte As Byte() = Encoding.Unicode.GetBytes("kensaku")
Dim bs As Byte() = Encoding.Unicode.GetBytes("xxxxxxxyyykensakuxxsaku")
Dim i As Integer = bs.Length
Dim ii As Integer = mozibyte.Length - 1
Dim iii As Integer = 0
While i > mozibyte.length -1
i = i - 1
If mozibyte(ii) = bs(i) Then
'MessageBox.Show(i.ToString() & " " & ii.ToString())
ii = ii - 1
If ii < 0 Then
Dim bss(200) As Byte '200は仮の数字
Dim iiii As Integer
For iiii = i To bs.Length - 2
bss(iii) = bs(i + iii)
iii = iii + 1
Next
Dim str As String = Encoding.Unicode.GetString(bss)
MessageBox.Show(str & " " & str.Length.ToString())
Exit While
End If
Else
i = i + (mozibyte.Length - ii) - 1
ii = mozibyte.Length - 1
End If
End While
End Sub
これで抜き出そうとした文字列(kensakuxxsaku)が抜き出せました。
ありがとうございます。
>文字列照合法はいろいろあるので、十分な速度が得られない場合はググってみてください(BM法とか)
理解途中なんで、解釈違いかもしれませんが3文字マッチして4文字目で違う場合2文字ずらしても大丈夫。
これだと、aaaabの中からaaabだとすり抜けそうなんですが・・。
KMP法やBM法はaiueoみたいに同じ文字が連続してないときに使うといいってことなんでしょうか。
VBのサイトとは趣旨が違いますが、よろしければお願いします。
ツイート | ![]() |