arhitector / zerg
v0.2
2016-12-20 08:24 UTC
Requires
- php: >=5.4.0
- klermonte/php-bio: dev-master
Requires (Dev)
- phpunit/phpunit: 4.2.*
This package is auto-updated.
Last update: 2024-09-13 02:38:58 UTC
README
Zerg 是一个小型 PHP 工具,允许您轻松解析结构化二进制文件,如 lsdj 内存转储文件、jpeg 编码的图像或您自定义的二进制格式文件。
简介
如果您正在阅读此内容,那么您可能非常清楚为什么需要在 PHP 中读取二进制文件。因此,我不会向您解释这不是一个好主意。尽管如此,我还是很高兴您需要在 PHP 中这样做。这就是我创建 zerg 项目的初衷。在创建过程中,我受到了以下项目的影响: alexras/bread 和 themainframe/php-binary。
安装
composer require klermonte/zerg dev-master
或者,将 "klermonte/zerg": "dev-master"
添加到您的 composer.json 依赖列表中,并运行 composer update
用法
// Describe your binary format in zerg language $fieldCollection = new \Zerg\Field\Collection([ 'stringValue' => ['string', 15], 'intValue' => ['arr', 5, ['int', 8]], 'enumValue' => ['enum', 8, [ 0 => 'zero', 10 => 'ten', 32 => 'many' ], ['default' => 'not found'] ] ]); // Wrap your data in one of zerg streams $sourceStream = new \Zerg\StringStream("Hello from zerg123456"); //Get your data structure $data = $fieldCollection->parse($sourceStream); print_r($data); /* Array ( [stringValue] => Hello from zerg [intValue] => Array ( [0] => 49 [1] => 50 [2] => 51 [3] => 52 [4] => 53 ) [enumValue] => not found ) */
字段类型
整数
// Object notation // -------------------------------------- // $field = new Int(<size>, <options>); $field = new Int(4); $field = new Int('byte', [ 'signed' => true, 'formatter' => function($value) { return $value * 100; } ]); // Array notation // -------------------------------------- // $fieldArray = ['int', <size>, <options>];
可用选项
字符串
// Object notation // -------------------------------------- // $field = new String(<size>, <options>); $field = new String(16); $field = new String('short', [ 'endian' => PhpBio\Endian::ENDIAN_BIG, 'formatter' => function($value) { return str_repeat($value, 2); } ]); // Array notation // -------------------------------------- // $fieldArray = ['string', <size>, <options>];
可用选项
填充
// Object notation // -------------------------------------- // $field = new Padding(<size>); $field = new Padding(16); // Array notation // -------------------------------------- // $fieldArray = ['padding', <size>];
枚举
// Object notation // -------------------------------------- // $field = new Enum(<size>, <values>, <options>); $field = new Enum(8, [0, 1, 2, 3]); $field = new Enum('short', [ 1234 => 'qwerty1', 2345 => 'qwerty2' ], [ 'default' => 'abcdef' ] ); // Array notation // -------------------------------------- // $fieldArray = ['enum', <values>, <options>];
可用选项
以及所有来自 整数 字段类型的选项。
条件
// Object notation // -------------------------------------- // $field = new Conditional(<key>, <fields>, <options>); $field = new Conditional('/path/to/key/value', [ 1 => ['int', 32], 2 => ['string', 32] ], [ 'default' => ['padding', 32] ] ); // Array notation // -------------------------------------- // $fieldArray = ['conditional', <fields>, <options>];
可用选项
数组
// Object notation // -------------------------------------- // $field = new Arr(<count>, <field>, <options>); $field = new Arr(10, ['int', 32]); // Array notation // -------------------------------------- // $fieldArray = ['arr', <field>, <options>];
可用选项
集合
// Object notation // -------------------------------------- // $field = new Collection(<fields>, <options>); $field = new Collection([ 'firstValue' => ['int', 32], 'secondValue' => ['string', 32] ]); // Array notation // -------------------------------------- // $fieldArray = ['collection', <fields>, <options>]; // or just // $fieldArray = <fields>;
反向链接
大小、计数和条件键参数可以声明为反向链接 - 已解析值的路径。路径可以以 /
符号开头,表示数据集的根,或者以 '../' 表示相对路径。
$fieldCollection = new \Zerg\Field\Collection([ 'count' => ['string', 2], 'intValue' => ['arr', '/count', ['int', 8]] ]); $sourceStream = new \Zerg\StringStream("101234567890"); $data = $fieldCollection->parse($sourceStream); print_r($data); /* Array ( [count] => 10 [intValue] => Array ( [0] => 49 [1] => 50 [2] => 51 [3] => 52 [4] => 53 [5] => 54 [6] => 55 [7] => 56 [8] => 57 [9] => 48 ) ) */
条件示例
$fieldCollection = new \Zerg\Field\Collection([ 'count' => ['string', 2], 'conditional' => ['conditional', '/count', [ 0 => ['string', 80], 10 => ['int', 16] ], [ 'default' => ['string', 2] ] ] ]); $sourceStream = new \Zerg\StringStream("101234567890"); $data = $fieldCollection->parse($sourceStream); print_r($data); /* Array ( [count] => 10 [conditional] => 12849 ) */