バイナリ検索で求まるアドレスが実値と誤差がある

解決


CNX  2006-01-14 02:35:14  No: 129541

VB6.0(SP6)でバイナリから指定文字列を検索するプロシージャを作成中ですが、うまくいきません。(厳密には、うまくいくときもあった)

引数として、ファイル番号、検索開始アドレス、検索文字列を渡します。
順次Getして検索文字列と比較し、合致したらそのときのアドレスを戻り値とするだけなのですが、実際のアドレスと1〜2バイトずれたりします。
当初はs = string(Len(target), " ")として、文字列変数sにダイレクトにGetした上で比較していましたが、Byte文字列でも結果は同じでした。

原因、対策判れば教えていただければと思います。
よろしくお願いいたします。

Private Function SearchPoint(ByVal filenum As Long, ByVal start_point As Variant, ByVal target As String) As Long

    If Not DEBUGMODE Then On Error GoTo err

    Dim wrkChar() As Byte
    Dim i As Integer
    Dim r As Long

    ReDim wrkChar(1 To Len(target))

    SearchPoint = start_point
    Do While Not EOF(filenum)
        Get #filenum, SearchPoint, wrkChar
        ' 指定された文字列を検出
        For i = 1 To Len(target)
            If (Asc(Mid(target, i, 1)) <> wrkChar(i)) Then Exit For
            If (i = Len(target)) Then
                Debug.Print target, Hex(SearchPoint)
                Exit Function
            End If
        Next

        SearchPoint = SearchPoint + 1
    Loop

    SearchPoint = 0

    Exit Function

err:
    
    MsgBox get_res(139) & "(SearchPoint)" & vbCrLf & get_res(140) & vbCrLf & err.Description & "(" & err.number & ")"
    End

End Function


CNX  2006-01-14 02:59:15  No: 129542

自己レスです。
見た目確かにアドレスが違うのですが、問題は書き込み時に余計なものが頭に挿入されるところだったようです。現在確認中なので、保留とさせてください。


CNX  2006-01-14 03:15:18  No: 129543

自己解決しました。Putするときの引数にString型文字列を指定する場合、Dimで宣言する際に個別に宣言することで問題が出なくなったように思われます。(なんで!?)

×Dim s, t as String
○Dim s as String
  Dim t as String

前も引っかかった気がしますが、忘れてました。
2回目なので、きっとこの解決方法は本当だと思われますが……不思議


いな  2006-01-14 03:34:54  No: 129544

Dim s, t as String

は言い換えると
Dim s as Variant
Dim t as String

になります。


魔界の仮面弁士  2006-01-14 04:31:00  No: 129545

もし、連続して表記するならば、
  Dim s As String, t As String
と書く必要がありますので、注意してください。

Dim s, t As String と記述した場合、s は既定の型(通常は Variant)になります。
# VB.NET の場合は、s も t も String になりますけど。

もし、Variant を Put した場合には、先頭にデータ型情報が付加されます。

この場合は、先頭 2バイトが 08,00 (=vbString)、続く 2バイトに文字列の長さ、
それから文字列本体……という形式で出力される事になりますね。


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

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






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