2017-05-03 12 views
0

私はいくつかのアドバイスを使うことができます - PHPでバイナリファイルを解析しています。具体的にはSega Genesisのrom-fileです。私が作った表によれば、特定のバイトは文字に対応しているか、ゲームのテキストエンジンで異なるものを制御しています。PHPでバイナリファイルのバイトを解析し、グループをプレースホルダに変換する

あり改行、条件、色や他の原料の束のための文字だけでなく、「コントローラ」-bytesのために使用されたバイトが、あるので、定型文は、おそらく次のようになります。

FC 03 E7 05 D3 42 79 20 64 6F 69 6E 67 20 73 6F 2C BC BE 08 79 6F 75 20 6A 75 73 74 20 61 63 71 75 69 72 65 64 BC BE 04 61 20 74 65 73 74 61 6D 65 6E 74 20 74 6F 20 79 6F 75 72 BC 73 74 61 74 75 73 20 61 73 20 61 20 77 61 72 72 69 72 21 6F BD私は翻訳できBC

<FC><03><E7><05><D3>By doing so,<NL><BE><08>you just acquired<NL><BE><04>a testament to your<NL>status as a warrior!<CURSOR> 

私は..

を参照してください、 文字に変換バイト(7F 00)や改行を(例えば長さなどのコントローラーバイト文字列のプロパティを指定して特定の位置に自分自身の値を書きたいですBC)は1バイトのみで構成され、その他は2(BE XX)で構成されます。

は、私は、このようなバイトを認識し、私を聞かせて私のパーサをしたい(XとYは、私は一緒に私の翻訳された文字列を入れながら計算する必要があるオフセットを参照してください) FC XX YY:条件(FC)はさえ5バイトで構成しますXX YYを動的に書きます。 strtrを使用して、私は "グループ"を置き換えることができます。私は静的なバイトコードを配列に入れます。

パーサーをフレキシブルに保ちながら、これをどのように行いますか? ありがとう!

+0

この[FC(\ w \ w){4} | BE(\ w \ w)|(\ w \ w) '](https://regex101.com/r/kR9kdP/1)は機能しますか? ?これはあなたが言及した3つのルール、FC + 4バイトまたはBE + 1バイトまたはただ1バイトを含む – degant

+0

私は正規表現のが良くないですが、私はあなたの式をpreg_matchで使用して、エラーが出ました:preg_match():区切り文字は、英数字またはバックスラッシュであってはなりません。 – Alex

+0

最初にデモをチェックしてください:https://regex101.com/r/kR9kdP/1これがあなたが探しているものか、マッチが正しく機能しているかどうかを確認してください。このようにしてみることができます:https://regex101.com/r/kR9kdP/1/codegen?language=php – degant

答えて

0

文字列として16進値を使用できると仮定すると、この正規表現を使用して、前述のように解析できます。 FC ****またはBE **以外のルールをさらに特定した場合は、その正規表現を下の正規表現に直接追加して抽出することもできます。

(?<fc>FC(\w\w){4})|(?<be>BE(\w\w))|(?<any>(\w\w)) 

は簡単よう$matches['fc']としてアレイを使用して結果セットを識別するために、名前付きグループfcbeanyを使用します。

正規表現のデモ:https://regex101.com/r/kR9kdP/5

$re = '/(?<fc>FC(\w\w){4})|(?P<be>BE(\w\w))|(?P<any>(\w\w))/'; 
$str = 'FC03E705D3FC0006042842616D20626162612062'; 

preg_match_all($re, $str, $matches, PREG_PATTERN_ORDER, 0); 

// Print the entire match result 
print_r(array_filter($matches['fc'])); // Returns an array with all FC**** 
print_r(array_filter($matches['be'])); // Returns an array with all BE** 
print_r(array_filter($matches['any'])); // Returns rest ** 

PHPデモ:http://ideone.com/qWUaob

サンプルの結果:

Array 
(
    [0] => FC03E705D3 
    [1] => FC00060428 
) 
Array 
(
    [50] => BE08 
    [59] => BE04 
    [113] => BE08 
    [132] => BE04 
) 

・ホープ、このことができます!

0

\x##を使用して16進数の文字を正規表現に入力できます。##は、その文字の16進数です。その後、FC後に4つのバイトが含まれています

preg_match('/(?=\xfc).{4}/, $bytes, $match); 

$match[0]:だからとFC XX YYを一致させることができます。あなたは、キャプチャグループと対にそれらを分割できます。

preg_match('/(?=\xfc)(..)(..)/, $bytes, $match); 

$match[1]XX$match[2]YYが含まれていますが含まれています。

+0

ありがとう!式をもう少し説明できますか?FCは合計5バイトで構成されていますので、次の4つは興味深いものです。どのように表現すれば、キャプチャするバイト数を知ることができますか? – Alex

+0

キャプチャするバイト数は、 '\ cfc'の後の' .'の数です。私は 'XX'と' YY'がちょうど1バイトだと考えました。 – Barmar

関連する問題