本家BBSに投稿した、とっても基本的な線形検索のアルゴリズム。わざとモジュール化していません。
// 文字列でやっているが、文字列以外のバイナリデータでも原理は同じ。
sTarget = "Hot Soup Processor" // 検索されるバイナリデータ(この中から検索するバイナリデータを探す)
sSerch = "oce" // 検索するバイナリデータ
// ここから検索処理。
// バイナリデータではstrlenは使えないので、何らかの方法で大きさを調べてください。
repeat strlen( sTarget ) - ( strlen( sSerch ) - 1 )
_cnt = cnt : iResult = cnt
repeat strlen( sSerch )
if peek( sTarget, _cnt + cnt ) != peek( sSerch, cnt ) { // peekで1バイトずつ比較する
iResult = -1
break
}
loop
if ( iResult >= 0 ) : break // 見つかったので検索終了
loop
// 検索処理ここまで。
if ( iResult >= 0 ) {
// バイナリデータが見つかった場合
sdim sMarker, strlen( sTarget ) + 1
memset sMarker, ' ', strlen( sTarget )
memset sMarker, '^', strlen( sSerch ), iResult // 見つけた文字列の部分にマークする
mes sTarget
mes sMarker
mes sSerch + "を" + iResult + "バイトめに見つけました。"
mes "instr()の結果(" + instr( sTarget, 0, sSerch ) + ")と一緒でしょ?"
} else {
// バイナリデータが見つからなかった場合
mes "見つかりませんでした。"
}
stop
0 件のコメント:
コメントを投稿