0

ある時点で Web サイトから SFX アーカイブをダウンロードし、そこからデータを抽出する必要がある PHP アプリを作成しています。

これを Linux ボックスで実行しているので、ファイルの SFX 実行可能部分を切り取って、圧縮ファイルをファイル システムに保存する必要があります。次に、プログラムを実行して解凍/解凍します。(SFX アーカイブは基本的に、その後に圧縮されたアーカイブが追加された EXE ファイルです。16 進エディタなどを使用して手動で試してみたところ、問題なく動作しました。)

SFX アーカイブ内の圧縮アーカイブのファイル タイプは常に同じであり、そのファイル タイプのマジック ナンバーを知っています。

次に PHP で行う必要があるのは、ファイルをダウンロードした後 ( file_get_contents()URL パラメーターを使用して簡単に想定してみましょう)、ファイルがメモリ内にある場合、圧縮されたアーカイブのマジック ナンバーから始まるコンテンツからデータを抽出する必要があることです。

ある種の正規表現方法を実行できるのではないかと考えていましたが、これを文字データではなくバイナリ情報 (マジック ナンバーは 16 進数で表す必要があります) として処理する必要があります。マジック ナンバー自体には、印刷されない/読み取り可能な文字として表示されない 16 進値が含まれています。

4

2 に答える 2

2

正規表現はバイナリセーフです。ただし、 を使用したほうがよい場合がありますstrpos

$magicpos = strpos($downloaded_data,"\x1a\x09\x01");

これは、マジック ナンバーが 0x1A 0x09 0x01 であることを前提としています。実際の数字に置き換えることができます。それで:

$archive = substr($downloaded_data,$magicpos);

これにより、マジックナンバー(含まれる)以降のアーカイブデータが取得されます。

于 2012-11-02T15:11:46.847 に答える
1

次の構文preg_matchでバイナリ化できます。\xXX

preg_match('/\x00/', chr(0))
于 2012-11-02T15:10:41.357 に答える