{"_id":"@emdzej/ncsx-daten","_rev":"6-71fba039fba3408aa4ab916239e08097","name":"@emdzej/ncsx-daten","dist-tags":{"latest":"0.9.0"},"versions":{"0.4.0":{"name":"@emdzej/ncsx-daten","version":"0.4.0","_id":"@emdzej/ncsx-daten@0.4.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"ec2cbf265c0cffc87d513762e0a3d10fd658d469","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.4.0.tgz","fileCount":31,"integrity":"sha512-EgrCHKhek7C2yzGht1QELDTQj8EV9EWZ1/ZToNZDs5wBwF+39Uv8yz1GJ9l0Vtcx3jFllUv5apuD3HdjOVOqhw==","signatures":[{"sig":"MEUCIFyF6z471n8uLLEbC5mEvmXK0Vyjk+rSZy8skEcsVhf4AiEAx2Nyjm6rBIXq1CwRDGG2we/pVsgDi9ubZICgKxQdaKo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51819},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-daten-0.4.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/74f1d92e95d790b2e7bedcab86c15300/emdzej-ncsx-daten-0.4.0.tgz","_integrity":"sha512-EgrCHKhek7C2yzGht1QELDTQj8EV9EWZ1/ZToNZDs5wBwF+39Uv8yz1GJ9l0Vtcx3jFllUv5apuD3HdjOVOqhw==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/daten"},"_npmVersion":"11.14.1","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-daten_0.4.0_1779705613958_0.4956964889977804","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emdzej/ncsx-daten","version":"0.5.1","_id":"@emdzej/ncsx-daten@0.5.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"5dc6fed5bec9d2a6fefb990769ec313e1ed47c42","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.5.1.tgz","fileCount":31,"integrity":"sha512-bOqMdhG0LwGLJnvgj6nmWWLUB88G6lAq93hf+ZPZlwWvMIGeybUXDKMybhDXknzLd+U/ZCg4wDbSezGCCVX+YQ==","signatures":[{"sig":"MEUCIDsJZoPST288gD0dsBfUynq+/MZHdIoY+f6ppUqmwgx/AiEA0LaUggzNfOYjdoK7yhXNOYkKIXhjWcKnL02FyFo09ts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51819},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-daten-0.5.1.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/b9b7741cd97b89caf876cf6374730328/emdzej-ncsx-daten-0.5.1.tgz","_integrity":"sha512-bOqMdhG0LwGLJnvgj6nmWWLUB88G6lAq93hf+ZPZlwWvMIGeybUXDKMybhDXknzLd+U/ZCg4wDbSezGCCVX+YQ==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/daten"},"_npmVersion":"11.14.1","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-daten_0.5.1_1779876427087_0.5959250689748721","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@emdzej/ncsx-daten","version":"0.6.0","_id":"@emdzej/ncsx-daten@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"635103bf77cc687626fa0590d4ca19665f83797f","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.6.0.tgz","fileCount":31,"integrity":"sha512-iNdFm2FDZkqRNWbePHmnsTaFKlvOl2Y/V304H6XsBHmjeafCjamczFXB0woPUppTZ+IXJp1VCrvvXgDNBR0y3g==","signatures":[{"sig":"MEUCIGhR8fX+5SVsN5Fy5OFn+L5wJQz/yCl6loZJX+E+uelrAiEAoni52d5Wu+rNn689bGj7ICXRX9QXKXgc3pZ/02RqwZ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51819},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-daten-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/395f38caf005dc63eadc57a31a65ff8a/emdzej-ncsx-daten-0.6.0.tgz","_integrity":"sha512-iNdFm2FDZkqRNWbePHmnsTaFKlvOl2Y/V304H6XsBHmjeafCjamczFXB0woPUppTZ+IXJp1VCrvvXgDNBR0y3g==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/daten"},"_npmVersion":"11.14.1","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-daten_0.6.0_1779981230502_0.7349189664450086","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ncsx-daten","version":"0.7.0","_id":"@emdzej/ncsx-daten@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"3b4f05cfcf8c6f16e41b8fe342fe14cb180cd6e4","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.7.0.tgz","fileCount":31,"integrity":"sha512-DJMx7q7sJcjkXY74efLu2txsYtL9ArYYnU/Z/26M+USmojvR7u39EI7ERIIffkLxyQJjxUTQlBiIB9KD7KiKQg==","signatures":[{"sig":"MEUCIQDO0LLkvumAz2L31PnJM2x79iM/jT4LGHa2KrvROCONBQIgbAdxY4cy3qw39VqowVnPiMFQNJ/aHnpdADjrFPps/pM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51819},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-daten-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/017133fd71aa94d5919a56cfb98c8027/emdzej-ncsx-daten-0.7.0.tgz","_integrity":"sha512-DJMx7q7sJcjkXY74efLu2txsYtL9ArYYnU/Z/26M+USmojvR7u39EI7ERIIffkLxyQJjxUTQlBiIB9KD7KiKQg==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/daten"},"_npmVersion":"11.14.1","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-daten_0.7.0_1780062996664_0.2520438457061973","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ncsx-daten","version":"0.8.0","_id":"@emdzej/ncsx-daten@0.8.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ncsx#readme","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"dist":{"shasum":"aa38587c9297d0d02febfce59f66dcd64e2bcb5a","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.8.0.tgz","fileCount":31,"integrity":"sha512-xk2OasRPkAoCzTAEaemDzRbnqmJuoFRwoWRd35K7t63/MiCdyzVszWNz8UMtQoX7YMoBxAQ7Ea3XPWwpGSlK5g==","signatures":[{"sig":"MEUCIEw10vj+Q1wVVUh1YkY+reIvfWW287NwpSbJxDNJf/vKAiEA3Jspb9G8dkNdiGw9xqzk8uKFK+O4CBFk4wakBtvFRs0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51819},"main":"dist/index.js","type":"module","_from":"file:emdzej-ncsx-daten-0.8.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","clean":"rm -rf dist .turbo *.tsbuildinfo","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/79e3076f1c31b2909c264bfc2a074e6e/emdzej-ncsx-daten-0.8.0.tgz","_integrity":"sha512-xk2OasRPkAoCzTAEaemDzRbnqmJuoFRwoWRd35K7t63/MiCdyzVszWNz8UMtQoX7YMoBxAQ7Ea3XPWwpGSlK5g==","repository":{"url":"git+https://github.com/emdzej/ncsx.git","type":"git","directory":"packages/daten"},"_npmVersion":"11.16.0","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","directories":{},"_nodeVersion":"22.22.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.8","@types/node":"^22.13.1"},"_npmOperationalInternal":{"tmp":"tmp/ncsx-daten_0.8.0_1780758395355_0.326016615596177","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@emdzej/ncsx-daten","version":"0.9.0","description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","main":"dist/index.js","types":"dist/index.d.ts","type":"module","devDependencies":{"@types/node":"^22.13.1","vitest":"^2.1.8"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/daten"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","test:watch":"vitest","lint":"eslint .","typecheck":"tsc --noEmit","clean":"rm -rf dist .turbo *.tsbuildinfo"},"_id":"@emdzej/ncsx-daten@0.9.0","bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","_integrity":"sha512-nRc+AkL+tIvIeI8LYHpKwJ4LHdSxlQFH7PmiGJLD0CvRR2mOr7VUjSpO5YKUph4DwCO03a3jISGJu3dpbXW4Lw==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/dd50c432e5c6b37f4c9135f2f67e5ec4/emdzej-ncsx-daten-0.9.0.tgz","_from":"file:emdzej-ncsx-daten-0.9.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-nRc+AkL+tIvIeI8LYHpKwJ4LHdSxlQFH7PmiGJLD0CvRR2mOr7VUjSpO5YKUph4DwCO03a3jISGJu3dpbXW4Lw==","shasum":"4b2ccb609f26177ea06bb03f6449db3179b6d63a","tarball":"https://registry.npmjs.org/@emdzej/ncsx-daten/-/ncsx-daten-0.9.0.tgz","fileCount":31,"unpackedSize":51819,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDSDkSKxEEDtAJXi1UspAoKXxt3iDRZ2tC8wsWyg1Z0wQIgWSWrMhGla9sDcZyb53gOSjiVU35TCnVX4YoI4tWKquE="}]},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"directories":{},"maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ncsx-daten_0.9.0_1783336548133_0.7735516718999718"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-25T10:40:13.787Z","modified":"2026-07-06T11:15:48.378Z","0.4.0":"2026-05-25T10:40:14.101Z","0.5.1":"2026-05-27T10:07:07.221Z","0.6.0":"2026-05-28T15:13:50.734Z","0.7.0":"2026-05-29T13:56:36.815Z","0.8.0":"2026-06-06T15:06:35.499Z","0.9.0":"2026-07-06T11:15:48.264Z"},"bugs":{"url":"https://github.com/emdzej/ncsx/issues"},"homepage":"https://github.com/emdzej/ncsx#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/ncsx.git","directory":"packages/daten"},"description":"Parser for BMW NCSEXPER DATEN binary-frame files (BR_REF.DAT, *SGET.000, *SGVT.000, *.Cxx, etc.). Spec: ../../docs/daten-format.md","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ncsx-daten\n\nParser for BMW **NCSEXPER DATEN binary-frame files** — the format every chassis-table,\nSG-coding, and lookup file under `C:\\NCSEXPER\\DATEN\\` is encoded in.\n\nThis is the foundational package in the ncsx stack: every higher-level package\n(`chassis`, `cabd`, `function-list`, `options`, …) takes a parsed `DatenFile` as input.\n\nFull format spec: [`../../docs/daten-format.md`](../../docs/daten-format.md).\nConcrete delta vs. the original `bimmerz/packages/ncs-data` POC:\n[`../../docs/POC-DELTAS.md`](../../docs/POC-DELTAS.md).\n\n## File types this parses\n\n| File pattern               | What it is                                                    |\n|----------------------------|---------------------------------------------------------------|\n| `BR_REF.DAT`               | Chassis index — list of supported chassis + aliases           |\n| `<BR>DST.000`              | Per-chassis dataset overview (e.g. `E46DST.000`)              |\n| `<BR>SGET.000`             | SG-list selectors with `SGAUSWAHL_*` and AUFTRAGSAUSDRUCK     |\n| `<BR>SGVT.000`             | SG variants                                                   |\n| `<BR>ZCSUT.000`            | ZCS update tables                                             |\n| `<BR>CVT.000`              | Coding variants (per-FSW order-option predicates)             |\n| `<SGBD>.Cxx`               | Per-SG CABD coding rules (`PARZUWEISUNG_FSW` + PSWs etc.)     |\n| `SWT<KIND><NN>.DAT`        | Keyword↔KEYID lookup tables (ASW/FSW/PSW)                     |\n| `<BR>AUSBL.H00`, `*.K00`   | Auxiliary binary tables                                       |\n\n## Install\n\n```bash\npnpm add @emdzej/ncsx-daten\n# or, in the ncsx monorepo:\n\"@emdzej/ncsx-daten\": \"workspace:*\"\n```\n\n## Quick start\n\n```ts\nimport { readFileSync } from 'node:fs';\nimport { parseDatenFile } from '@emdzej/ncsx-daten';\n\nconst buf = readFileSync('NCSEXPER/DATEN/BR_REF.DAT');\nconst file = parseDatenFile(buf);\n\nfor (const block of file.blocks) {\n  console.log(`block 0x${block.id.toString(16)} ${block.name}`);\n  for (const row of block.rows) {\n    console.log('  ', row);\n  }\n}\n```\n\n## Frame format (one-page primer)\n\n```\nstruct frame {\n  uint8_t  size;                 // payload length in bytes\n  uint16_t type;                 // u16 little-endian\n  uint8_t  payload[size];\n  uint8_t  crc;                  // XOR-fold of [size, type_lo, type_hi, payload]\n};\n```\n\n| Frame type | Meaning                                                |\n|------------|--------------------------------------------------------|\n| `0x0100`   | Signature 1                                            |\n| `0x0200`   | Signature 2                                            |\n| `0x0300`   | Block definition — id + name                           |\n| `0x0400`   | Block definition — format string                       |\n| `0x0500`   | Block definition — field names (comma-separated)       |\n| `0xFF00`   | Divider — end of definitions, start of data            |\n| any other  | Data row for the block whose id matches the frame type |\n\nFormat-string mini-language: scalars `B` (u8) `W` (u16 LE) `L` (u32 LE) `S` (ASCII+NUL) `A`\n(length-prefixed raw bytes), with modifiers `{X}` (optional u8 presence), `(X)` (u16-count\ncollection), `X(X)` (non-empty list), `XX(XX)` (range list).\n\n## API\n\n| Export                  | Purpose                                                        |\n|-------------------------|----------------------------------------------------------------|\n| `parseDatenFile(buf)`   | Two-pass parse: definitions then data rows                     |\n| `parseFormatString(s)`  | Just the format-string mini-language                           |\n| `readScalar(type, …)`   | Read one scalar value from a payload                           |\n| `readRow(fields, payload)` | Read one row's worth of values                              |\n| `xorFoldCrc(bytes)`     | The DATEN per-frame CRC (XOR-fold of header + payload)         |\n\n### `DatenFile` shape\n\n```ts\ninterface DatenFile {\n  signatures: { type: number; payload: Uint8Array }[];\n  blocks: Block[];\n  /** All data rows in document order — same row objects as `block.rows`. */\n  rowsInOrder: OrderedRow[];\n}\n\ninterface Block {\n  id: number;\n  name: string;       // e.g. \"PARZUWEISUNG_FSW\"\n  fields: FieldDef[]; // declared columns\n  rows: RowValues[];  // one entry per data frame for this block\n}\n```\n\n`rowsInOrder` exists because some consumers (`function-list`, `options`) need\ncross-block adjacency — e.g. `PARZUWEISUNG_PSW1` always follows its parent\n`PARZUWEISUNG_FSW` in the binary, and that ordering is lost if you only walk\n`block.rows`.\n\n## Options\n\n```ts\nparseDatenFile(buf, {\n  strictCrc: false,        // default true — when false, mismatched frames are skipped\n  onWarning: (msg) => { … }, // CRC mismatch, malformed format string, unknown frame type\n});\n```\n\n## Related\n\n- [`@emdzej/ncsx-cabd`](../cabd/) — operates on `PARZUWEISUNG_FSW` row values from this parser.\n- [`@emdzej/ncsx-chassis`](../chassis/) — loads + indexes whole chassis bundles.\n- [`@emdzej/ncsx-function-list`](../function-list/) — turns a CABD `.Cxx` into a typed catalog.\n- [`@emdzej/ncsx-predicate`](../predicate/) — evaluates the `A`-field AUFTRAGSAUSDRUCK bytes.\n- Spec: [`../../docs/daten-format.md`](../../docs/daten-format.md).\n","readmeFilename":"README.md"}