VB.NET で、InstrB に変わるもの??

解決


エデル  2005-03-30 09:08:08  No: 120553

現在、VB5にてあるファイルをバイナリで open して、
InstrBを利用し、バイナリ検索をして、そのアドレス位置を取得する
仕組みのプログラムを作成しています。

VB.NETにて、同じプログラムを組もうとしたのですが、
InstrB は、サポートしなくなっており困っています。
特殊な文字コードとは関係なく純粋なバイナリでの検索が行いたいのですが
いい方法はありませんでしょうか?

下記は、現プログラムの例題を記入しました。

    Dim Pw_bytData()  As Byte
    Dim Pw_Search4(3) As Byte
    Dim Pw_address    As Long
   
    FlNum = FreeFile
    Open strFlName For Binary Access Read As #FlNum
        Get #FlNum, , Pw_bytData

        'バイナリデータの検索は、これが一番早いのか??
        ' "00 11 00 B1" を検索する
        Pw_Search4(0) = &H00
        Pw_Search4(1) = &H11
        Pw_Search4(2) = &H00
        Pw_Search4(3) = &HB1

        Pw_address = InStrB(Pw_bytData, Pw_Search4) - 1

    Close #FlNum


魔界の仮面弁士  2005-03-30 18:43:32  No: 120554

案1) Array.IndexOf() で、先頭バイトの位置を検索してから、
  2バイト目以降が一致するかを個別に調べる。

案2) S = System.BitConverter.ToString(バイナリ) にて、
  バイナリを16進数文字列に置換してから InStr()で検索。


エデル  2005-03-31 08:34:14  No: 120555

返信ありがとうございます。

> 案1) Array.IndexOf() で、先頭バイトの位置を検索してから、
>   2バイト目以降が一致するかを個別に調べる。
なるほど・・・
やはり、個別に処理をループしながら検索するしかないかな〜、
バイナリ検索になるので先頭バイトをちょっと特殊な値にしても
00〜FFまで256種類なので結構ヒットして処理に時間かかってしまう
1バイトづつ、ベタでループするよりは全然早いのですけど・・・
とほほ、なぜ「主に2バイト文字セット」を理由にInStrBを無くしたんだ
「主に」以外の場合も考慮して代わりを用意して欲しかったな〜。

> 案2) S = System.BitConverter.ToString(バイナリ) にて、
>   バイナリを16進数文字列に置換してから InStr()で検索。

こちらは試して見ました!
結果、バイナリデータの為、文字列化を行って検索すると
Unicodeでの全角文字列と同じコードがあるのか、VB5でのInStrBと
結果が若干少ない値になってしまい、アドレス位置としての取得が
出来ていない結果でした。


エデル  2005-03-31 09:12:22  No: 120556

勘違いしていました。

私の試したのは、
>System.Text.Encoding.GetEncoding(932).GetString(バイナリ)
単純にそのまま文字列化をしていました。
これではダメですね。

> 案2) S = System.BitConverter.ToString(バイナリ) にて、
>   バイナリを16進数文字列に置換してから InStr()で検索。

こちらは、16進数の文字列変換後でした。
さっそく試してみたいと思います。
16進数文字列変換が、サイズ的にどれだけ出来るか心配です・・


魔界の仮面弁士  2005-03-31 18:12:47  No: 120557

> バイナリ検索になるので先頭バイトをちょっと特殊な値にしても
> 00〜FFまで256種類なので結構ヒットして処理に時間かかってしまう

あれ、そんなに時間がかかりますか。InStrBの何倍程度になりました?

  元データのバイナリのサイズが極端に大きくて、
  検索するバイナリの長さが比較的短くて、しかも
  ヒットする位置をすべて列挙する必要がある。

……というケースでは、それなりの時間がかかりそうですけれど、
それはInStrBでも同じですね。(元データの内容次第ではありますけど)


エデル  2005-04-01 05:34:10  No: 120558

案2)を試して見ました。
サイズは3MBくらいで、以前のVB5 InStrBとなんら変わらないくらい
でした。

どうもありがとうございました。


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

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






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