7个版本 (4个重大更改)

0.7.1 2020年1月8日
0.7.0 2020年1月7日
0.6.0 2019年8月27日
0.5.0 2019年5月1日
0.3.0 2019年2月28日

#103 in #byte-slice


2 个crate中使用(通过 bitstream_reader

MIT/Apache

21KB
363

Crates.io Documentation Dependency status

bitbuffer

用于读取和写入任意位长度数据类型(可能在源数据中未对齐)的工具

读取二进制数据的主要方法是首先创建一个 BitReadBuffer ,将其包装到 BitReadStream 中,然后从流中读取。

一旦你有了BitStream,有两种不同的方法可以读取数据

  • 使用 read_boolread_intread_floatread_bytesread_string 读取基本类型、字符串和字节数组
  • 使用 readread_sized 读取实现 BitReadBitReadSized 特性的任何类型
    • BitRead 用于无需任何大小信息即可读取的类型(例如,null终止的字符串、浮点数、整数等)
    • BitReadSized 用于需要外部大小信息才能读取的类型(固定长度字符串、任意长度整数

如果所有字段实现 BitReadBitReadSized,则可以使用 #[derive] 使用 BitReadBitReadSized 特性。

对于写入数据,您将输出 Vec 包装到一个 BitWriteStream 中,然后可以使用类似 BitReadStream 的方式使用它

  • 使用 write_boolwrite_intwrite_floatwrite_byteswrite_string 读取基本类型、字符串和字节数组
  • 使用 writewrite_sized 读取实现 BitWriteBitWriteSized 特性的任何类型
    • BitWrite 用于不需要任何大小信息即可写入的类型(例如:以null终止的字符串、浮点数、整数等)
    • BitWriteSized 用于需要外部大小信息才能写入的类型(固定长度字符串、任意长度整数等)

与读取对应者类似,BitWriteBitWriteSized 特性可以在所有字段实现 BitWriteBitWriteSized 的情况下与 #[derive] 一起使用。

示例

use bitbuffer::{BitReadBuffer, LittleEndian, BitReadStream, BitRead, BitWrite, BitWriteStream};

#[derive(BitRead, BitWrite)]
struct ComplexType {
    first: u8,
    #[size = 15]
    second: u16,
    third: bool,
}

let bytes = vec![
    0b1011_0101, 0b0110_1010, 0b1010_1100, 0b1001_1001,
    0b1001_1001, 0b1001_1001, 0b1001_1001, 0b1110_0111
];
let buffer = BitReadBuffer::new(&bytes, LittleEndian);
let mut stream = BitReadStream::new(buffer);
let value: u8 = stream.read_int(7)?;
let complex: ComplexType = stream.read()?;

let mut write_bytes = vec![];
let mut write_stream = BitWriteStream::new(&mut write_bytes, LittleEndian);
write_stream.write_int(12, 7)?;
write_stream.write(&ComplexType {
    first: 55,
    second: 12,
    third: true
})?;

许可证

许可方式为以下之一

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按照上述方式双许可,无需附加条款或条件。

依赖关系

~1.5MB
~36K SLoC