2个不稳定版本

0.2.0 2021年7月5日
0.1.0 2021年7月4日

#2231编码

24 每月下载次数
用于 elfbin

MIT 许可证

35KB
647

binbin for Rust

binbin 是一个用于在任意格式中写入结构化二进制数据的库。

它具有以下有用功能,通过 std::io::Writestd::io::Seekstd::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
]);

无运行时依赖