https://github.com/linusu/node-cstruct
Use C `struct`s in Javascript while keeping the syntax intact.
https://github.com/linusu/node-cstruct
Last synced: about 1 year ago
JSON representation
Use C `struct`s in Javascript while keeping the syntax intact.
- Host: GitHub
- URL: https://github.com/linusu/node-cstruct
- Owner: LinusU
- Created: 2015-08-01T21:30:08.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2017-11-15T20:37:52.000Z (over 8 years ago)
- Last Synced: 2025-05-07T23:45:00.606Z (about 1 year ago)
- Language: JavaScript
- Size: 23.4 KB
- Stars: 9
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# `cstruct`
Use C `struct`s in Javascript while keeping the syntax intact.
## Installation
```sh
npm install --save cstruct
```
## Usage
```javascript
const struct = require('cstruct')
const Color = struct`
uint8 r, g, b;
`
const Point = struct`
uint8 x, y;
${Color} color;
`
// Read from buffer
const raw = Buffer.from('7823ff00ff', 'hex')
const data = Point.read(raw)
// Write to buffer
const data = { x: 120, y: 35, color: { r: 255, g: 0, b: 255 } }
const raw = Point.write(data)
```
## API
### `struct`
This is a function that is suppose to be used together with [tagged template
strings][1]. The template string is a struct definition as you write it in C.
The return value is a new instance of `Schema`.
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
### `Schema.byteLength`
The length of the struct in bytes.
### `Schema.attributes`
An array of the attributes of the struct. Each attribute is an object with the
following properties: `name`, `type`, `offset`, `isArray`, `count`.
### `Schema.linkedTypes`
A `Map` with other types used inside of this type. The key is the name of the
struct and the value is a `Schema`.
### `Schema.read(buffer[, offset])`
Read the struct from a buffer into a structured javascript object. Optionally
supply an offset to start reading at that position.
### `Schema.write(data[, targetBuffer[, targetOffset]])`
Write the javascript object `data` into a buffer. If no `targetBuffer` is
supplied, a new one will be created with the same length as the struct.
Optionally supply an offset to start writing at that position.
### `Schema.readArray(count, buffer[, offset])`
Read `count` number of structs from a buffer into an array. Optionally
supply an offset to start reading at that position.
### `Schema.writeArray(data[, targetBuffer[, targetOffset]])`
Write an array of javascript objects into a buffer. If no `targetBuffer` is
supplied, a new one will be created with the same length as the structs combined
size. Optionally supply an offset to start writing at that position.
### `struct.read(typeName, buffer[, offset])`
Read a primitive type from a buffer. Optionally supply an offset to start
reading at that position.
### `struct.write(typeName, data[, targetBuffer[, targetOffset]])`
Write a primitive type into a buffer. If no `targetBuffer` is supplied, a new
one will be created with the same length as the type. Optionally supply an
offset to start writing at that position.
### `struct.readArray(typeName, count, buffer[, offset])`
Read `count` number of primitive types from a buffer into an array. Optionally
supply an offset to start reading at that position.
### `struct.writeArray(typeName, data[, targetBuffer[, targetOffset]])`
Write an array of primitive types into a buffer. If no `targetBuffer` is
supplied, a new one will be created with the same length as the primitive types
combined size. Optionally supply an offset to start writing at that position.
## Endianness
By default reading and writing is done in the current computer's endianness.
All function can be postfixed with `LE` or `BE` to force a specific endianness,
e.g. `struct.readBE('uint32_t', buffer)`.
## Compatibility
Template strings is enabled by default in [io.js][2] but not in [Node.js][3]
version `0.12`. [Babel][4] is capable of transpiling for almost all
environments, including Node.js.
[2]: https://iojs.org/
[3]: https://nodejs.org/
[4]: https://babeljs.io/