2个不稳定版本
0.2.0 | 2021年7月5日 |
---|---|
0.1.0 | 2021年7月4日 |
#2231 在 编码
24 每月下载次数
用于 elfbin
35KB
647 行
binbin for Rust
binbin
是一个用于在任意格式中写入结构化二进制数据的库。
它具有以下有用功能,通过 std::io::Write
、std::io::Seek
和 std::io::Read
实现
- 自动将Rust整型数据编码为小端或大端。
- 插入填充以对齐到特定数量的字节,例如填充到最近的四字节增量。
- 插入占位符用于在写入过程中稍后才知道的值,例如跟随某些变量大小数据的尺寸,然后一旦知道最终值,就可以在原地更新它们。
- 从已写入的数据块中派生新值,例如将校验和作为标题的一部分。
有关更多信息,请参阅 binbin
文档。
lib.rs
:
一个实用库,用于更轻松地写入任意二进制文件格式的结构化数据。
此库特别适用于包含文件内容其他部分偏移量的格式,或在生成子节之前需要指定子节大小的格式。它包括为特定偏移量标签化的机制,然后包括从这些偏移量派生的值的占位符,一旦结果已知,就可以更新这些值。
示例:以小端顺序写入向量
let mut buf = Vec::<u8>::new();
binbin::write_vec_le(&mut buf, |w| {
let header_start = w.position()? as u32;
let header_len = w.deferred(0 as u32);
w.write(&b"\x7fELF"[..])?;
w.write(1 as u8)?; // 32-bit ELF
w.write(1 as u8)?; // Little-endian ELF
w.write(1 as u8)?; // ELF header version
w.write(0 as u8)?; // ABI
w.skip(8)?;
w.write(1 as u16)?; // Relocatable
w.write(0x28 as u16)?; // ARM instruction set
w.write(1 as u32)?; // ELF version
w.write(0 as u32)?; // no entry point
w.write(0 as u32)?; // no program header table
let section_header_pos = w.write_deferred(0 as u32)?;
w.write(0 as u32)?; // flags
w.write_placeholder(header_len)?;
w.write(0 as u32)?; // size of program header entry (none)
w.write(0 as u32)?; // number of program header entries (none)
let section_header_size = w.write_deferred(0 as u32)?;
let section_header_count = w.write_deferred(0 as u32)?;
let header_end = w.position()? as u32;
w.resolve(header_len, header_end - header_start);
w.write(0 as u32)?; // no string table
w.align(4)?;
let pos = w.position()? as u32;
w.resolve(section_header_pos, pos)?;
// (...and then the rest of an ELF writer...)
Ok(())
})?;
assert_eq!(buf, vec![
0x7f, b'E', b'L', b'F', // magic number
1, 1, 1, 0, // initial header fields
0, 0, 0, 0, 0, 0, 0, 0, // padding
0x01, 0x00, // relocatable
0x28, 0x00, // ARM instruction set
0x01, 0x00, 0x00, 0x00, // ELF version
0x00, 0x00, 0x00, 0x00, // entry point
0x00, 0x00, 0x00, 0x00, // program header table offset
// Section header position was deferred and resolved later
0x40, 0x00, 0x00, 0x00, // section header position
0x00, 0x00, 0x00, 0x00, // flags
// Header length was deferred and resolved later
0x3c, 0x00, 0x00, 0x00, // header length
0x00, 0x00, 0x00, 0x00, // size of program header entry
0x00, 0x00, 0x00, 0x00, // number of program header entries
// Section header entries were deferred but never resolved,
// so they retain their placeholder values.
0x00, 0x00, 0x00, 0x00, // size of section header entry
0x00, 0x00, 0x00, 0x00, // number of section header entries
0x00, 0x00, 0x00, 0x00, // no string table
]);