23 个版本

0.11.0 2024年4月4日
0.10.9 2022年12月13日
0.10.8 2022年8月6日
0.10.7 2022年5月1日
0.7.1 2020年2月12日

#1#read-stream

Download history 99/week @ 2024-04-21 194/week @ 2024-04-28 128/week @ 2024-05-05 145/week @ 2024-05-12 126/week @ 2024-05-19 116/week @ 2024-05-26 128/week @ 2024-06-02 88/week @ 2024-06-09 89/week @ 2024-06-16 99/week @ 2024-06-23 51/week @ 2024-06-30 98/week @ 2024-07-07 88/week @ 2024-07-14 73/week @ 2024-07-21 96/week @ 2024-07-28 86/week @ 2024-08-04

每月352次下载
5 包中使用 (直接使用 4 个)

MIT/Apache

150KB
3K SLoC

Crates.io Documentation Dependency status

bitbuffer

用于读取和写入任意位长度数据类型的工具,可能不是字节对齐的源数据

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

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

  • 使用 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 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。

依赖

~0.6–1.4MB
~29K SLoC