ribs_binary 1.0.0-dev.12 copy "ribs_binary: ^1.0.0-dev.12" to clipboard
ribs_binary: ^1.0.0-dev.12 copied to clipboard

Library provides fully typed binary parsing, encoding and decoding. Also supports streaming parsing.

ribs_binary #

ribs_binary is a library for working with binary data in a type-safe, purely functional way. It provides powerful data structures for bit and byte manipulation, along with a composable codec system for encoding and decoding complex data structures.

Core Components #

BitVector & ByteVector #

BitVector and ByteVector are immutable data structures for handling binary data at the bit and byte levels, respectively.

  • BitVector: Perfect for protocols that require bit-level precision.
  • ByteVector: Optimized for byte-aligned data.
// Create a BitVector from a hex string
final bv = BitVector.fromValidHex('0a0b0c');

// Bit-level manipulation
final adjusted = bv.drop(4).take(12).concat(BitVector.fromInt(0xff, size: 8));

// Convert to ByteVector
final bytes = bv.bytes;

Binary Codecs #

The Codec class allows you to define how Dart types are converted to and from binary representation. Codecs are highly composable, similar to scodec in Scala.

// Define a simple codec for a 32-bit integer followed by a boolean
final codec = Codec.tuple2(Codec.int32, Codec.boolean);

// Encode a tuple
final encoded = codec.encode((42, true));

// Decode back
final decoded = codec.decode(encoded.getOrElse(() => BitVector.empty));

Composing Complex Codecs #

You can build complex codecs by composing smaller ones by using the product function on a tuple of Codecs. Just provide a function to convert the tuple to your type and a function to convert your type to a tuple.

final userCodec = (
  Codec.uint8,                                  // age
  Codec.variableSized(Codec.uint8, Codec.utf8), // name
).product(
  (age, name) => User(age, name),
  (user) => (user.age, user.name),
);

Streaming #

ribs_binary supports streaming binary data using standard Dart Streams.

StreamDecoder #

Use StreamDecoder to decode a stream of bits/bytes into a stream of Dart objects incrementally. This is useful for processing data from sockets or files without loading everything into memory.

final stream = socket.transform(StreamDecoder(messageCodec));

await for (final msg in stream) {
  print('Received message: $msg');
}

StreamEncoder #

Conversely, StreamEncoder allows you to encode a stream of Dart objects into a continuous stream of bits.

Documentation #

For more detailed information, guides, and API documentation, visit the Full Ribs Documentation Site.

Example #

Check out the full example program in example/example.dart.

0
likes
150
points
128
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Library provides fully typed binary parsing, encoding and decoding. Also supports streaming parsing.

Homepage
Repository (GitHub)
View/report issues

Topics

#binary #codec #parsing #encoding #functional-programming

License

unknown (license)

Dependencies

meta, ribs_core

More

Packages that depend on ribs_binary