cstruct-buffer
TypeScript icon, indicating that this package has built-in type declarations

1.0.5 • Public • Published

CStruct-Buffer

A TypeScript library for precise C-style memory layout serialization/deserialization.

Core Features

  • 🏗️ Define structs with C-like memory layout
  • 🔢 Support for all major numeric types (8/16/32/64-bit, signed/unsigned, float/double)
  • 📝 String support (ASCII/UTF-8)
  • 🧩 Nested structs and arrays
  • ⚡ Optimized binary serialization/deserialization
  • ↔️ Endianness control (little/big endian)
  • 🧠 Automatic alignment and padding calculation
  • 🔍 Runtime validation and error checking

Installation

npm install cstruct-buffer

Basic Usage

Struct Definition

@CStruct.Layout({ pack: 4 })
class SensorData extends CStruct {
  @CStruct.U32(1, 8)  // Single value with 8-byte alignment
  timestamp: number = 0;
  
  @CStruct.F64(3)     // Fixed array of 3 doubles
  readings: number[] = [0.0, 0.0, 0.0];
  
  @CStruct.Str(0, 1)  // Flexible string (last field)
  status: string = "OK";
}

Decorator Specifications

Class Layout Options

@CStruct.Layout({ 
  pack?: number;  // Member alignment (0=default)
  align?: number; // Struct alignment (0=natural)
})

Field Decorator Parameters

Primitive Types (U8/I16/F32 etc.)

@CStruct.U8(arrLength?, align?)
@CStruct.U16(arrLength?, align?)
@CStruct.U32(arrLength?, align?)
@CStruct.U64(arrLength?, align?)
@CStruct.I8(arrLength?, align?)
@CStruct.I16(arrLength?, align?)
@CStruct.I32(arrLength?, align?)
@CStruct.I64(arrLength?, align?)
@CStruct.F32(arrLength?, align?)
@CStruct.F64(arrLength?, align?)
Position Parameter Description
1 arrLength = 1 Array length: 0=flexible, 1=single, >1=fixed
2 align = 0 Field alignment (optional, default=0)

String Types

@CStruct.Str(maxBytes, align?)
Position Parameter Description
1 maxBytes = 0 Max bytes (0=flexible length)
2 align = 0 Field alignment (optional)

Struct Types

@CStruct.Struct(StructClass, arrLength?, align?)
Position Parameter Description
1 StructClass Nested struct class (must extend CStruct)
2 arrLength = 1 Array length
3 align = 0 Field alignment (optional, default=0)

Advanced Patterns

Nested Structures

@CStruct.Layout({ pack: 8 })
class Vector3D extends CStruct {
  @CStruct.F32(3) coordinates: number[] = [0,0,0];
}

@CStruct.Layout({ align: 16 })
class PhysicsObject extends CStruct {
  @CStruct.Struct(Vector3D) 
  position: Vector3D = new Vector3D();
  
  @CStruct.Struct(Vector3D, 4)  // Fixed array of 4 vectors
  vertices: Vector3D[] = Array(4).fill(new Vector3D());
}

Core Operations

Serialization

const sensor = new SensorData();
sensor.timestamp = Date.now();
sensor.readings = [25.3, 26.1, 24.9];
sensor.status = "ACTIVE";

// Serialize with default endianness (little-endian)
const buffer = sensor.serialize();

// Serialize with big-endian
const beBuffer = sensor.serialize('big');

Deserialization

// From network/data stream
const receivedBuffer = new Uint8Array([...]);

// Deserialize with validation
const restoredSensor = SensorData.deserialize(receivedBuffer);

console.log(restoredSensor.status); // "ACTIVE"

Endian Control

// Cross-platform data exchange
const networkBuffer = sensor.serialize('big');
const localCopy = SensorData.deserialize(networkBuffer, 'big');

Memory Layout Validation

// Verify struct size matches C implementation
console.log(sensor.size); // 64 (bytes)

// Check field offsets
console.log(sensor.Fields[0].offset); // 0
console.log(sensor.Fields[1].offset); // 8

Compatibility Notes

  1. Bit fields are NOT supported
  2. Flexible arrays must be last field
  3. Default alignment follows compiler behavior
  4. Struct nesting depth is unlimited

License

MIT

/cstruct-buffer/

    Package Sidebar

    Install

    npm i cstruct-buffer

    Weekly Downloads

    2

    Version

    1.0.5

    License

    MIT

    Unpacked Size

    30.5 kB

    Total Files

    7

    Last publish

    Collaborators

    • shuaihu