1.0.2 • Published 7 months ago

bitpacked v1.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
7 months ago

BitPackedBuffer

MIT License npm version

A high-performance JavaScript library for bit-level data manipulation with zero dependencies. Perfect for binary protocols, file formats, and low-level data operations.

Overview

BitPackedBuffer provides precise control over bit-level operations in JavaScript, supporting both big-endian and little-endian byte orders. Whether you're implementing a binary protocol, working with file formats, or handling low-level data, BitPackedBuffer is designed to meet your needs.

Key Features

  • 🚀 Zero dependencies, minimal overhead
  • 💫 Bit-level precision (1-32 bits)
  • 🔄 Big and little-endian support
  • 📦 Modern ES Module design
  • ⚡ Efficient memory usage
  • 🛡️ Comprehensive error checking

Installation

npm install bitpacked

Quick Examples

Basic Usage

import { BitPackedBuffer } from "bitpacked";

// Write mixed-width values
const buffer = new BitPackedBuffer()
  .write.bits(5, 3) // Write value 5 using 3 bits
  .write.bits(10, 4) // Write value 10 using 4 bits
  .write.string("Hi") // Write a string
  .alignToByte(); // Align to byte boundary

// Read them back
buffer.seek(0);
console.log(buffer.read.bits(3)); // → 5
console.log(buffer.read.bits(4)); // → 10
console.log(buffer.read.string(2)); // → "Hi"

Working with Endianness

// Create a little-endian buffer
const buffer = new BitPackedBuffer(null, "little");

// Write a 16-bit value
buffer.write.bits(1000, 16);

// Read it back
buffer.seek(0);
console.log(buffer.read.bits(16)); // → 1000

API Reference

Constructor

new BitPackedBuffer(
  contents?: Uint8Array | Buffer,
  endian?: 'big' | 'little'
)

Reading Operations

MethodDescriptionExample
read.bits(count)Read 1-32 bitsbuffer.read.bits(5)
read.bytes(count)Read multiple bytesbuffer.read.bytes(4)
read.string(length)Read fixed-length stringbuffer.read.string(10)
read.cString()Read null-terminated stringbuffer.read.cString()
read.int(bitCount)Read signed integerbuffer.read.int(16)
read.uint(bitCount)Read unsigned integerbuffer.read.uint(16)

Writing Operations

MethodDescriptionExample
write.bits(value, count)Write 1-32 bitsbuffer.write.bits(42, 7)
write.bytes(data)Write byte arraybuffer.write.bytes(bytes)
write.string(str)Write stringbuffer.write.string("hello")
write.cString(str)Write null-terminated stringbuffer.write.cString("hello")
write.int(value, bitCount)Write signed integerbuffer.write.int(-42, 16)
write.uint(value, bitCount)Write unsigned integerbuffer.write.uint(42, 16)

Buffer Management

MethodDescription
seek(position)Move to byte position
skip(bytes)Skip ahead bytes
mark(name?)Mark current position
reset(name?)Return to marked position
alignToByte()Align to byte boundary
clear()Reset buffer state
getBuffer()Get underlying buffer
isComplete()Check if all data read

Peeking Operations

Peeking operations don't advance the buffer position. They contain the same methods as read but return values without modifying the position.

MethodDescriptionExample
peek.bits(count)Peek 1-32 bitsbuffer.peek.bits(5)
peek.bytes(count)Peek multiple bytesbuffer.peek.bytes(4)
peek.string(length)Peek fixed-length stringbuffer.peek.string(10)
peek.cString()Peek null-terminated stringbuffer.peek.cString()
peek.int(bitCount)Peek signed integerbuffer.peek.int(16)
peek.uint(bitCount)Peek unsigned integerbuffer.peek.uint(16)

Common Use Cases

  • Binary file format parsing/writing
  • Network protocol implementation
  • Data compression/decompression
  • Game state serialization
  • Embedded systems communication

Error Handling

BitPackedBuffer includes comprehensive error checking:

try {
  buffer.read.bits(33); // Throws RangeError
} catch (error) {
  console.error("Invalid bit count:", error.message);
}

Performance Considerations

  • Align to byte boundaries when possible for better performance
  • Use mark()/reset() for temporary position changes
  • Pre-allocate buffers when size is known
  • Use the appropriate endianness for your data format

Contributing

Contributions are welcome! Here's how you can help:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes and commit: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

Please ensure your PR:

  • Includes tests for new functionality
  • Updates documentation as needed
  • Follows the existing code style
  • Includes a clear description of changes

Support

License

This project is licensed under the MIT License - see the LICENSE file for details.


Made with ❤️ by RedYetiDev

1.0.2

7 months ago

1.0.1

7 months ago

1.0.0

7 months ago

0.1.0

7 months ago