掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
バイナリファイルで文字列を検索するには? (ID:8180)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
具体的にコードを示します。単純パターン検索で、見つかったらファイルの先頭 からのオフセットを示します。みつからなかったら -1 を返します。 procedure TForm1.Button1Click(Sender: TObject); var ms:TMemoryStream; i,offset:integer; p:PByte; s:string; begin Randomize; ms := TMemoryStream.Create; try ms.SetSize(3000); p := ms.Memory; for i := 1 to 3000 do begin // ランダムパターンを生成 p^ := Random(256); Inc(p); end; s := 'ほにゃらほにゃら'; // 文字列をランダム位置に書き込む offset := Random(2900); ms.Position := offset; //ms.Write(s[1],Length(s)); Label1.Caption := IntToStr(offset); ms.SaveToFile('c:\Test.bin'); finally ms.Free; end; end; これは3000バイトのランダムバイトパターンを生成してファイルにします。 //ms.Write(s[1],Length(s)); の部分のコメントアウトをとると、ランダム な位置に 'ほにゃらほにゃら' の文字列を書き込みます。 function FindPattern(const Filename,str:string):integer; var ms:TMemoryStream; p:PByte; function ComparePattern(p1,p2:PByte;Count:integer):Boolean; var i:integer; begin result := false; for i := 1 to Count do begin if p1^ <> p2^ then exit; Inc(p1); Inc(p2); end; result := true; end; begin result := -1; ms := TMemoryStream.Create; ms.LoadFromFile(Filename); p := ms.Memory; while (integer(p)-integer(ms.Memory)) < (ms.Size-Length(str)+1) do begin if ComparePattern(p,PByte(str),Length(str)) then begin result := integer(p)-integer(ms.Memory); exit; end; Inc(p) end; end; procedure TForm1.Button2Click(Sender: TObject); var offset:integer; begin offset := FindPattern('c:\Test.bin','ほにゃらほにゃら'); Label2.Caption := IntToStr(offset); end; FindPattern() が今回つくった関数で、文字列と同じバイトパターンを検索して 見つかったらそのオフセットを返します。何回かテストしたところではうまく いっています。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.