You can do something similar with `libpnet` in rust:
#[packet]
struct Dns {
id: u16be,
qr: u1,
opcode: u4,
aa: u1,
tc: u1,
...
#[payload]
data: Vec<u8>,
}