Описание и декодирование бинарных структур данных в JavaScript (браузер + Node.js). Аналог struct из C.
- Регистрация типов — базовые целочисленные типы, float, строки, padding
- Структуры — именованные структуры из полей с автоматическим расчётом offset
- Вложенность — структура внутри структуры
- Массивы —
countдля повторяющихся полей - Строки — фиксированной длины (
string) и до NUL (cstring) - Endianness — little-endian (по умолчанию) и big-endian
- Чтение/запись —
AsUint8/16/32/64,AsInt8/16/32/64,AsFloat,AsDouble,AsString - Нативный модуль (опционально) — ускорение через C++ (node-gyp)
- Без зависимостей в браузере — чистый JS, работает как ES-модуль
- TypeScript-типы —
jsStruct.d.ts
| Формат | Детекция | Что парсится |
|---|---|---|
| BMP | magic BM (0x4D42) |
BMPFileHeader, BITMAPCOREHEADER, BITMAPINFOHEADER |
| JPEG | SOI 0xFFD8 | SOF0 (precision, H, W, components), все маркеры |
| WSQ | SOI 0xFFA0 + DTT/DQT/DHT/SOF | SOF (black, white, H, W, mShift, rScale, encoder, software), DTT, DQT, DHT, все маркеры |
jsStruct/
├── index.js # HTTP-сервер (статические файлы, ESM)
├── package.json # "type": "module"
├── rootHTML/
│ ├── index.html # Тестовая страница (BMP / JPEG / WSQ)
│ ├── test.js # Парсеры BMP, JPEG, WSQ
│ └── jsModule/
│ ├── jsStruct.js # Ядро (ES-модуль)
│ └── jsStruct.d.ts # TypeScript-типы
├── native_module/
│ ├── building.gyp # node-gyp конфиг (C++17)
│ └── src/testStruct.cpp # Нативный C++ модуль
├── MIME-TYPE/
│ └── all.json # База MIME-типов
├── test/
│ └── jsStruct.test.js # Unit-тесты (node --test, 39 тестов)
├── .github/workflows/
│ └── ci.yml # CI: Node 20/22
└── LICENSE # GPL v3
npm installДля нативного модуля (опционально):
npm run build:nativeimport { JSRegister, JSVariable } from './rootHTML/jsModule/jsStruct.js';
/* 1. Определить структуру */
JSRegister.struct('MyHeader', [
{ name: 'magic', type: 'uint16' },
{ name: 'version', type: 'uint32' },
{ name: 'name', type: 'string', count: 16 },
{ name: 'size', type: 'uint64' }
]);
/* 2. Создать инстанс */
const header = new JSVariable('MyHeader');
/* 3. Записать данные (из файла, сети, ...) */
header.setMemory(arrayBuffer);
/* 4. Чтение полей */
console.log(header.magic.AsUint16); /* number */
console.log(header.version.AsUint32); /* number */
console.log(header.name.AsString); /* string */
console.log(header.size.AsUint64); /* bigint */
/* 5. Запись */
header.magic.AsUint16 = 0x4D42;
header.name.AsString = 'hello';| Метод | Описание |
|---|---|
JSRegister.type(name, size) |
Зарегистрировать базовый тип |
JSRegister.struct(name, fields) |
Зарегистрировать структуру |
JSRegister.get(name) |
Получить тип по имени |
JSRegister.has(name) |
Проверить наличие |
JSRegister.clear() |
Очистить реестр (встроенные типы восстанавливаются) |
JSRegister.list() |
Список всех имён |
Базовый тип: имя + размер + (опционально) динамический размер.
Структура из полей. Итерируема, предоставляет:
fields— массив{name, type, count, offset, size}field(name)— info по имениtotalSize— суммарный размер
Обёртка над DataView. Геттеры/сеттеры:
AsUint8, AsInt8, AsUint16, AsInt16, AsUint32, AsInt32,
AsUint64, AsInt64, AsFloat, AsDouble, AsString
Инстанс структуры:
setMemory(buffer, byteOffset?)— загрузить данныеgetMemory()— получитьArrayBuffertoBytes()— получитьUint8Array- Поля доступны как свойства:
var.fieldName→JSValue
JSConfig.littleEndian = true; /* порядок байтов */
JSConfig.native = true; /* использовать нативный модуль */| Имя | Размер |
|---|---|
int8, uint8 |
1 |
int16, uint16 |
2 |
int32, uint32 |
4 |
int64, uint64 |
8 |
float32 |
4 |
float64 |
8 |
string |
count байт |
cstring |
до NUL |
padding |
count байт |
{ name: 'field', type: 'uint32' } // фиксированный тип
{ name: 'arr', type: 'uint16', count: 10 } // массив из 10
{ name: 'name', type: 'string', count: 16 } // строка 16 байт
{ name: 'path', type: 'cstring' } // строка до NUL
{ name: 'pad', type: 'padding', count: 4 } // выравнивание
{ name: 'inner', type: 'InnerStruct' } // вложенная структураnpm test39 unit-тестов (node --test), включая:
- Базовые типы и структуры
- Вложенность, массивы, строки
- Endianness (LE/BE)
- Чтение/запись всех типов
- JPEG SOF0 парсинг
- WSQ SOF парсинг
npm start # порт 8080
node index.js 9000 # порт 9000Статический HTTP-сервер (ESM), MIME-типы из MIME-TYPE/all.json.
npm run build:nativeC++17, node-addon-api (NAPI_DISABLE_CPP_EXCEPTIONS). Экспортирует: createStruct, readValue, writeValue, checksum (CRC32).
GitHub Actions: Node 20 и 22, npm test + npm run lint.
GNU GPL v3