2007年8月8日水曜日

バイナリデータの検索

本家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 件のコメント: