バイト型配列の部分抽出をするには?

解決


うい  2006-05-19 08:29:09  No: 131469

環境は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を表示するつもりです。
ヒントなど教えていただければ幸いです。
よろしくお願いします。


ガッ  2006-05-19 08:43:12  No: 131470

後方から文字列検査して、検索結果の位置から文字列として終端まで取ってくるのがいいのでは?


うい  2006-05-19 09:26:49  No: 131471

画像などにバイト型にして引っ付けた文字列をもう一回分解するために
バイト型で後ろから、文字列と同じ情報をさがす練習してます。


VB梅  2006-05-19 21:02:41  No: 131472

>'ここの処理がよくわかりません。
何かの問題みたいだなw

もし、そこだけに入れるとしたら。
検索文字列が見つかった場合のみ実行されるのだから
検索文字列をbssに代入すれば良いだけでは?

テスト問題でなければ
Dim str As String = Encoding.Unicode.GetString(bss)
bssをmozibyteに変えるとかで良いのでは?


うい  2006-05-19 22:36:51  No: 131473

レスありがとうございます。

bssってのはkensakudatessssがバイト型の配列で入ってる状態をイメージでしてました。
kensakudatessssの最初の文字位置は何バイト目かわかってるのにそこから
抜き出せなくてとまってます。
ここの処理がわかりません。
の部分ではbyte配列の部分抽出をしてbssに入れる処理を考えてます。

文章べたや説明不足でレスがしづらくてすいません。


VB梅  2006-05-20 00:17:20  No: 131474

ういさんへ
>kensakudatessssの最初の文字位置は何バイト目かわかってるのにそこから
>抜き出せなくてとまってます。
最初の文字から抜き出そうとするから、難しくなるのかな?
検索文字を配列に最後から順次格納していけばよいのでは?
ま、どちらでも同じです。

Dim bss(mozibyte.Length - 1) as byte

bss(ii) = bs(i)

あと、このプログラムだと最後(最初ii=0)のバイトが検索されていませんよ。

ここまで、プログラム組めるのですから、配列の中身を見比べる等をして
自分で問題を解決する力を付けましょう。

抜き出すのなら、
For I = 開始 to 終了
  bss(I-開始) = bs(i)
Next I
こんな感じかな


VB梅  2006-05-20 01:15:39  No: 131475

ういさんへ

System.BitConverter.ToString(bs) →「63-00-6B-00-65-00・・・・・」

バイト配列を文字列に変換してInstr()で
検索する方法もありますよ。

お試しください。


うい  2006-05-20 02:20:54  No: 131476

VB梅さんへ

ご丁寧なご返事ありがとうございます。
おかげで検索周辺の文字列がメッセージボックスに表示されあと一歩というところまできております。
文字列にできることでより検索が簡単そうです。
その方法も試してみます。
ありがとうございます。


ガッ  2006-05-20 04:12:43  No: 131477

Array.LastIndexOf()メソッドとか使えないのかな…
あと、文字列照合法はいろいろあるので、十分な速度が得られない場合はググってみてください(BM法とか)


うい  2006-05-20 20:51:53  No: 131478

希望した文字列が抜き出せるようになりました。
'ここの処理がわかりません。  が解決したのを載せます。

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のサイトとは趣旨が違いますが、よろしければお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加