7 个版本

使用旧的 Rust 2015

0.1.6 2021 年 9 月 9 日
0.1.5 2016 年 9 月 12 日
0.1.3 2016 年 8 月 30 日
0.1.2 2016 年 3 月 23 日
0.1.0 2015 年 10 月 15 日

233数据结构 中排名

Download history 378/week @ 2024-04-04 276/week @ 2024-04-11 212/week @ 2024-04-18 268/week @ 2024-04-25 262/week @ 2024-05-02 231/week @ 2024-05-09 202/week @ 2024-05-16 376/week @ 2024-05-23 261/week @ 2024-05-30 233/week @ 2024-06-06 263/week @ 2024-06-13 262/week @ 2024-06-20 497/week @ 2024-06-27 478/week @ 2024-07-04 430/week @ 2024-07-11 506/week @ 2024-07-18

1,966 每月下载量
用于 7 crates

MIT 许可证

44KB
842

Continuous integration crates.io

概述

此 Rust 包实现了一组用于构建复杂二进制流的类型,主要用于编写处理二进制数据的测试。它设计用来允许你创建具有特定属性的数据输入,这些属性在其他情况下可能难以产生。例如,在小端系统上测试大端字节序的数据、通过产生某些方式格式不正确的输入来测试错误处理代码,或测试解析较大整体格式的一部分而无需生成整个格式。

你主要通过创建一个 Section 来使用此包,它提供 API 来逐步构建字节数据序列。除了使用固定数据输入外,你还可以插入 Label 的内容,这些是尚未知的值的占位符。这些可以用于插入从其他地方计算出的数据,例如到正在构建的 Section 的偏移量。完成时,你可以调用 Section::get_contents() 来生成一个 Vec<u8> 的内容。

示例

  use test_assembler::*;

  // Create some `Label`s, which can be used to fill in values that aren't yet known,
  // or marked to provide offsets into data in a `Section`.
  let l1 = Label::new();
  let l2 = Label::new();
  // `Section`s have an associated default endianness.
  let s = Section::with_endian(Endian::Little);
  // `start` is a `Label` whose value is the beginning of the `Section`'s data.
  let start = s.start();
  let s = s.append_bytes(&[0x01, 0x02, 0x03])
    // Append a 32-bit word with the section's default endianness
    // Methods on `Section` chain to make writing repeated entries simple!
    .D32(0xabcd0102)
    // L1 will now have the value of the current offset into the section.
    .mark(&l1)
    // Append the value of the `Label` l2 as a 16-bit word in big-endian
    .B16(&l2)
    // Append 10 bytes of 0xff.
    .append_repeated(0xff, 10);
  // Labels that have been added to Sections need to have a fixed value before
  // you call `Section::get_contents`. Calling `Section::mark` will do that,
  // or you can give them a constant value.
  l2.set_const(0x1234);
  let bytes = s.get_contents().unwrap();
  // By default the `start` Label doesn't have a const value, but you can do math
  // on Labels that have relative offsets!
  let offset = &l1 - &start;
  assert_eq!(7, offset);
  let i = offset as usize;
  // Label values that appended have their value inserted when `Section::get_contents`
  // is called, so they can depend on things that aren't known at insertion time.
  assert_eq!(&[0x12, 0x34], &bytes[i..i + 2]);

对于实际用例的示例,您可以查看 gimli 包中的各种测试minidump 包中的堆栈展开测试,或 minidump 包中的 synth_minidump 测试,这些测试还演示了使用此包构建测试固定文件以构建更复杂结构化数据。

许可证

本软件遵循MIT许可证提供。请参阅许可证

依赖项

约120KB