0

我可以使用一些建议 - 我正在解析 php 中的二进制文件,具体来说,它是 Sega Genesis rom 文件。根据我制作的表格,某些字节对应于字符或使用游戏的文本引擎控制不同的东西。

有字节,用于字符以及“控制器”字节,用于换行符、条件、颜色和一堆其他东西,所以一个典型的句子可能看起来像这样:

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 7461 65 65 7 7 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 6F 72 21 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>

我想为这样的控制器字节字符串指定属性,例如长度并将我自己的值写入某些位置..

请参阅,转换为字符(00 到 7F)或换行符(BC)的字节仅由单个字节组成,而其他字节由 2(BE XX)组成。条件 (FC) 甚至包含 5 个字节:FC XX YY(其中 X 和 Y 指的是我在将翻译的字符串放在一起时需要计算的偏移量)

我希望我的解析器能够识别这些字节并让我动态地编写 XX YY。使用 strtr 我只能替换“组”,例如当我将静态字节串放入数组时。

在保持解析器灵活的同时,您将如何做到这一点?谢谢!

4

2 回答 2

0

您可以使用 将十六进制字符放入正则表达式中\x##,其中##是字符的十六进制代码。所以你可以匹配FC XX YY

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

$match[0]然后将包含 . 之后的 4 个字节FC。您可以将它们与捕获组分成几对:

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

$match[1]将包含XX并将$match[2]包含YY.

于 2017-05-03T20:53:51.333 回答
0

假设您将十六进制值作为字符串提供,您可以使用此正则表达式来解析它,就像您提到的那样。如果您识别出除 FC**** 或 BE** 之外的更多规则,则可以直接将它们添加到下面的正则表达式中,以便它们也被提取。

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

现在使用命名组fc, be,any使用数组轻松识别结果集,例如$matches['fc'].

正则表达式演示: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
)

希望这可以帮助!

于 2017-05-03T21:17:41.203 回答