現在、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
案1) Array.IndexOf() で、先頭バイトの位置を検索してから、
2バイト目以降が一致するかを個別に調べる。
案2) S = System.BitConverter.ToString(バイナリ) にて、
バイナリを16進数文字列に置換してから InStr()で検索。
返信ありがとうございます。
> 案1) Array.IndexOf() で、先頭バイトの位置を検索してから、
> 2バイト目以降が一致するかを個別に調べる。
なるほど・・・
やはり、個別に処理をループしながら検索するしかないかな〜、
バイナリ検索になるので先頭バイトをちょっと特殊な値にしても
00〜FFまで256種類なので結構ヒットして処理に時間かかってしまう
1バイトづつ、ベタでループするよりは全然早いのですけど・・・
とほほ、なぜ「主に2バイト文字セット」を理由にInStrBを無くしたんだ
「主に」以外の場合も考慮して代わりを用意して欲しかったな〜。
> 案2) S = System.BitConverter.ToString(バイナリ) にて、
> バイナリを16進数文字列に置換してから InStr()で検索。
こちらは試して見ました!
結果、バイナリデータの為、文字列化を行って検索すると
Unicodeでの全角文字列と同じコードがあるのか、VB5でのInStrBと
結果が若干少ない値になってしまい、アドレス位置としての取得が
出来ていない結果でした。
勘違いしていました。
私の試したのは、
>System.Text.Encoding.GetEncoding(932).GetString(バイナリ)
単純にそのまま文字列化をしていました。
これではダメですね。
> 案2) S = System.BitConverter.ToString(バイナリ) にて、
> バイナリを16進数文字列に置換してから InStr()で検索。
こちらは、16進数の文字列変換後でした。
さっそく試してみたいと思います。
16進数文字列変換が、サイズ的にどれだけ出来るか心配です・・
> バイナリ検索になるので先頭バイトをちょっと特殊な値にしても
> 00〜FFまで256種類なので結構ヒットして処理に時間かかってしまう
あれ、そんなに時間がかかりますか。InStrBの何倍程度になりました?
元データのバイナリのサイズが極端に大きくて、
検索するバイナリの長さが比較的短くて、しかも
ヒットする位置をすべて列挙する必要がある。
……というケースでは、それなりの時間がかかりそうですけれど、
それはInStrBでも同じですね。(元データの内容次第ではありますけど)
案2)を試して見ました。
サイズは3MBくらいで、以前のVB5 InStrBとなんら変わらないくらい
でした。
どうもありがとうございました。
ツイート | ![]() |