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
自己レスです。
見た目確かにアドレスが違うのですが、問題は書き込み時に余計なものが頭に挿入されるところだったようです。現在確認中なので、保留とさせてください。
自己解決しました。Putするときの引数にString型文字列を指定する場合、Dimで宣言する際に個別に宣言することで問題が出なくなったように思われます。(なんで!?)
例
×Dim s, t as String
○Dim s as String
Dim t as String
前も引っかかった気がしますが、忘れてました。
2回目なので、きっとこの解決方法は本当だと思われますが……不思議
Dim s, t as String
は言い換えると
Dim s as Variant
Dim t as String
になります。
もし、連続して表記するならば、
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バイトに文字列の長さ、
それから文字列本体……という形式で出力される事になりますね。
ツイート | ![]() |