bunpack
A library for packing and unpacking binary data in Rust using format strings similar to Python's struct module.
Usage
use ;
let data: = pack!;
let value: i32 = unpack!;
assert_eq!;
Format Specifiers
Byte Order
Format specifiers can begin with an optional character to specify the byte order:
| Specifier | Description |
|---|---|
@ |
Native byte order |
< |
Little-endian |
> |
Big-endian |
Type Specifiers
Following the optional byte order, format specifiers can include one or more type specifiers:
| Specifier | Rust Type | Size in bytes |
|---|---|---|
c |
char |
4 |
b |
i8 |
1 |
B |
u8 |
1 |
? |
bool |
1 |
h |
i16 |
2 |
H |
u16 |
2 |
i |
i32 |
4 |
I |
u32 |
4 |
q |
i64 |
8 |
Q |
u64 |
8 |
o |
i128 |
16 |
O |
u128 |
16 |
n |
isize |
native |
N |
usize |
native |
f |
f32 |
4 |
d |
f64 |
8 |
s |
&str |
pack: length of string |
p |
&[u8] |
pack: length of byte array |
P |
*const () |
native |
Repeat Counts
Type specifiers can be chained together to create tuples of values. For example, iHf specifies a (i32, u16, f32) tuple.
Type specifiers can be wrapped in Rust-style arrays to indicate repeat counts.
Example: [i; 3] specifies a [i32; 3] array, and [i; 2][H; 4] specifies ([i32; 2], [u16; 4]).
let values = ;
let bytes = pack!;
let unpacked: = unpack!;
assert_eq!;
More examples
let str = "Hello, World!";
let bytes = pack!;
let unpacked: = unpack!;
assert_eq!;
let str = "Hello, World!";
let bytes = pack!;
let unpacked: = unpack!;
assert_eq!;
let bytes = pack!;
let unpacked: u16 = unpack!;
assert_eq!;