#struct #deku #bit #deserialize #serialization

no-std deku

bit level serialization/deserialization proc-macro for structs

30 releases

new 0.19.1 May 22, 2025
0.18.1 Sep 9, 2024
0.17.0 May 23, 2024
0.16.0 Feb 28, 2023
0.1.2 Mar 30, 2020

#60 in Encoding

Download history 15198/week @ 2025-02-02 107329/week @ 2025-02-09 103522/week @ 2025-02-16 128596/week @ 2025-02-23 143757/week @ 2025-03-02 129240/week @ 2025-03-09 104827/week @ 2025-03-16 103296/week @ 2025-03-23 102011/week @ 2025-03-30 90615/week @ 2025-04-06 75756/week @ 2025-04-13 71441/week @ 2025-04-20 81068/week @ 2025-04-27 77320/week @ 2025-05-04 72678/week @ 2025-05-11 68927/week @ 2025-05-18

303,772 downloads per month
Used in 55 crates (36 directly)

MIT/Apache

270KB
4.5K SLoC

Deku

Latest Version Rust Documentation Actions Status codecov

Declarative binary reading and writing

This crate provides bit-level, symmetric, serialization/deserialization implementations for structs and enums

Why use Deku

Productivity: Deku will generate symmetric reader/writer functions for your type! Avoid the requirement of writing redundant, error-prone parsing and writing code for binary structs or network headers

Usage

Compiler support: requires rustc 1.81+

[dependencies]
deku = "0.19"

no_std:

[dependencies]
deku = { version = "0.19", default-features = false, features = ["alloc"] }

Example

See documentation or examples folder for more!

Read big-endian data into a struct, modify a value, and write it

use deku::prelude::*;

#[derive(Debug, PartialEq, DekuRead, DekuWrite)]
#[deku(endian = "big")]
struct DekuTest {
    #[deku(bits = 4)]
    field_a: u8,
    #[deku(bits = 4)]
    field_b: u8,
    field_c: u16,
}

fn main() {
    let data: Vec<u8> = vec![0b0110_1001, 0xBE, 0xEF];
    let (_rest, mut val) = DekuTest::from_bytes((data.as_ref(), 0)).unwrap();
    assert_eq!(DekuTest {
        field_a: 0b0110,
        field_b: 0b1001,
        field_c: 0xBEEF,
    }, val);

    val.field_c = 0xC0FE;

    let data_out = val.to_bytes().unwrap();
    assert_eq!(vec![0b0110_1001, 0xC0, 0xFE], data_out);
}

Changelog

See CHANGELOG.md

Dependencies

~0.8–2MB
~40K SLoC