- PVSM.RU - https://www.pvsm.ru -
jParser [1] делает простым чтение структур данных из двоичных файлов джаваскриптом.
Элементарные структуры:
Методы jParser:
Конструктор jParser:
Обычная структура Си
Вы можете описывать Си-подобные структуры данных. Это джаваскриптовый объект, в котором ключи являются именами данных, а их значения — типами.
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 и string0 в нижеследующем примере):
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(/+$/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 [5], обеспечив скачивание двоичных файлов в наилучшем двоичном формате. Подключите этот пропатченный код 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:
Анализ ICO. Это простой пример анализа двоичного файла на движке NodeJS. Он показывает, как решаются многие типичные задачи, возникающие при разборе двоичных данных.
Распаковщик Tar [8]. Это простой пример разбора двоичного файла внутри браузера.
Средство показа моделей World of Warcraft [10]. Использует jParser для чтения двоичного кода трёхмерной модели, затем WebGL для её отображения.
Внутренние файлы Diablo 3
Автор: Mithgol
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/7708
Ссылки в тексте:
[1] jParser: https://github.com/vjeux/jParser
[2] jDataView: https://github.com/vjeux/jDataView
[3] ArrayBuffer: https://developer.mozilla.org/en/JavaScript_typed_arrays
[4] буфер Node.js: http://nodejs.org/docs/latest/api/buffer.html
[5] пропатчил jQuery: https://github.com/vjeux/jDataView/blob/master/jquery/jquery-patch.txt
[6] ico.js: https://github.com/vjeux/jParser/blob/master/sample/ico/ico.node.js
[7] ico.json: http://fooo.fr/%7Evjeux/github/jParser/sample/ico/favicon.json
[8] Распаковщик Tar: http://fooo.fr/%7Evjeux/github/jParser/sample/tar/tar.html
[9] tar.html: https://github.com/vjeux/jParser/blob/master/sample/tar/tar.html
[10] Средство показа моделей World of Warcraft: http://fooo.fr/%7Evjeux/github/jsWoWModelViewer/modelviewer.html
[11] m2.js: http://fooo.fr/%7Evjeux/github/jsWoWModelViewer/scripts/m2.js
[12] model.json: http://fooo.fr/%7Evjeux/github/jsWoWModelViewer/model.json
[13] convert.coffee: http://fooo.fr/%7Evjeux/boub/d3/files/convert.coffee
[14] Items_Weapons.json: http://fooo.fr/%7Evjeux/boub/d3/files/GameBalance/Items_Weapons.json
[15] Quest/ProtectorOfTristam.json: http://fooo.fr/%7Evjeux/boub/d3/files/Quest/ProtectorOfTristram.json
[16] TreasureClass/SkeletonKing: http://fooo.fr/%7Evjeux/boub/d3/files/TreasureClass/SkeletonKing.json
Нажмите здесь для печати.