- 構造を記述すると、その分析が自動的に行われます。
- データ分析プロセスは、自己記述関数を使用して拡張できます。 重要なファイルの分析を簡単にするもの。
- jParserはjDataViewに基づいて動作するため、ブラウザとNodeJSの両方で動作します 。
API
基本構造:- 符号なし整数: uint8、uint16、uint32
- 記号付き: int8、int16、int32
- 分数浮動小数点: float32、float64
- 文字列: char、string(len)
- 配列:配列(タイプ、len)
- 位置: tell、skip(len)、seek(pos)、seek(pos、func)
JParserのメソッド:
- 解析(値) -分析を開始し、再帰的に使用できます。 動作は引数のタイプによって異なります。
- function:関数を呼び出します。
- 文字列:参照解除(指定された名前は構造から取得されます);
- 配列:名前が配列の最初の要素であり、後続の要素が引数として機能する関数を呼び出します。
- object:同じフィールド名で解析された値を持つオブジェクトを返します。
- function:関数を呼び出します。
- tell() -分析されたファイルの現在の位置(オフセット)を返します。
- skip(count) -ファイル内のcountだけ前方に移動します(スキップします)。
- seek(position) -分析されたファイルの指定されたオフセットに移動します。
- seek(位置、コールバック) -指定されたオフセットに移動し、そこでコールバック()を実行してから、前の位置に戻ります。
- current-分析されている現在のオブジェクト。 分析中にすでに達成された結果にアクセスするために使用します。
JParserコンストラクター:
- 新しいjParser(データ、構造)
- dataは、 解析されるデータを含むjDataViewです。 バイト文字列(String)を渡すことができ、 ArrayBuffer
または Node.jsバッファを渡すことができます-これらのデータ型はjDataViewに自動的に変換されます。
- 構造 -すべてのデータ構造の説明を持つオブジェクト。
- dataは、 解析されるデータを含むjDataViewです。 バイト文字列(String)を渡すことができ、 ArrayBuffer
例
通常のC構造
var parser = new jParser(file, { header: { fileId: 'int32', recordIndex: 'int32', hash: ['array', 'uint32', 4], fileName: ['string', 256], } }); parser.parse('header'); // { // fileId: 42, // recordIndex: 6002, // hash: [4237894687, 3491173757, 3626834111, 2631772842], // fileName: ".\\Resources\\Excel\\Items_Weapons.xls" // }
参照資料
構造には他の構造が含まれる場合があります。 構造の名前を文字列として使用して、その説明を参照します。 次の例は、World of Warcraftのモデルを含むファイル構造の一部です。
nofs: { count: 'uint32', offset: 'uint32' }, animationBlock: { interpolationType: 'uint16', globalSequenceID: 'int16', timestamps: 'nofs', keyFrame: 'nofs' }, uvAnimation: { translation: 'animationBlock', rotation: 'animationBlock', scaling: 'animationBlock' }
ヘルパー関数
新しい基本型を定義することは難しくありません。 オブジェクト(次の例ではfloat3 )や配列(例ではfloat4 )など、既存のタイプの構成体を使用できます。 より複雑なタイプを定義したい場合、一次分析のためにthis.parseメソッドに依存する新しい関数を定義する機会が常にあります(次の例のhex32
float3: { x: 'float32', y: 'float32', z: 'float32' }, float4: ['array', 'float32', 4], hex32: function () { return '0x' + this.parse('uint32').toString(16); }, string0: function (length) { return this.parse(['string', length]).replace(/\0+$/g, ''); }
フィードバック
配列のサイズが事前にわからない場合は、整数を返す関数を構造体内のその場所に配置できます。 この関数では、 this.currentを使用して、現在分析中のオブジェクトにアクセスし、すでに受信したフィールドを読み取ることができます。
image: { width: 'uint8', height: 'uint8', pixels: [ 'array', ['array', 'rgba', function () { return this.current.width; }], function () { return this.current.height; } ] }
高度なデータ分析
jParserの優れた機能は、複雑な処理アルゴリズムをデータ構造記述内の関数で表現できることです。 これにより、構造記述をそのハンドラーのコードから分離することなく、複雑なファイルを分析できます。
entryHeader: { start: 'int32', count: 'int32' }, entry: function (type) { var that = this; var header = this.parse('entryHeader'); var res = []; this.seek(header.start, function () { for (var i = 0; i < header.count; ++i) { res.push(that.parse(type)); } }); return res; }, name: { language: 'int32', text: ['string', 256] }, file: { names: ['entry', 'name'] }
はじめに
NodeJSエンジン上
npmを使用してjParserをインストールする
npm install jParser
var fs = require('fs'); var jParser = require('jParser'); fs.readFile('file.bin', function (err, data) { var parser = new jParser(data, { magic: ['array', 'uint8', 4] }); console.log(parser.parse('magic')); });
ブラウザで
jQueryにパッチを適用し 、バイナリファイルが最適なバイナリ形式でダウンロードされるようにしました。 このパッチを適用したjQueryコードとjDataViewおよびjParserを接続します-これで
<script src="https://raw.github.com/vjeux/jDataView/master/jquery/jquery-1.7.1-binary-ajax.js"></script> <script src="https://raw.github.com/vjeux/jDataView/master/src/jdataview.js"></script> <script src="https://raw.github.com/vjeux/jParser/master/src/jparser.js"></script> <script> $.get('file.bin', function (data) { var parser = new jParser(data, { magic: ['array', 'uint8', 4] }); console.log(parser.parse('magic')); }, 'dataview'); </script>
注意事項
このツールは、ドキュメント化されていないJavaScript機能に依存しています。オブジェクトのフィールドの走査は、指定された順序で機能します。 ChromeとOperaでは、この暗黙のルールはデジタル名を持つフィールドでは機能しないことに注意してください。
既存のすべてのJavaScript実装で動作するには、このライブラリの次の2つのルールに従います。
- データ構造の説明にある数字でフィールド名を開始しないでください。
- 一度与えられた名前でフィールドを再定義しないでください。同じオブジェクトに同じ名前の別のフィールドを入れないでください。
デモ
ICO分析 。 これは、NodeJSエンジンを使用したバイナリ分析の簡単な例です。 バイナリデータの解析時に発生する典型的なタスクの数を示します。
アンパックタール これは、ブラウザ内でバイナリファイルを解析する簡単な例です。
- tar.htmlはjParser構造です。
ワールドオブウォークラフトモデルシャワー 。 jParserを使用して3次元モデルのバイナリコードを読み取り、次にWebGLで表示します。
- m2.jsはjParser構造です。
- model.jsonは分析の結果です。
![[スクリーンショット]](http://habrastorage.org/storage2/a69/478/a17/a69478a173a7edeff68ee0108454944a.png)
Diablo 3内部ファイル
- convert.coffeeはjParserのフレームワークです。 コーヒースクリプトを使用してファイル構造を記述するのはさらに簡単です。
- 処理されたファイルの例: