#bitstream #bit #binary #binary-data #read-write

tiny-bitstream

经典比特流库的标准实现

1 个不稳定版本

0.1.0 2023年2月12日

#15#bitstream


final-state-rs 使用

自定义许可

46KB
1K SLoC

Rust 实现的标准比特流

使用 meepmorp,你可以非常高效地在流上读写。这个库试图与你在 CC++ 中常见的所有先前标准实现并行,使用简单,结合了一些酷炫的 Rust 工具。

写入

在读取任何内容之前,有人需要先写入数据,如下所示

// This create you a stream with a `usize` a
// temporary register
let mut e_stream = BitEstream::new(len).unwrap();

// Add N bits in temp register
// ( You can go up to 64 bits on x64
//   and obviously to 32 bits if x86 )
e_stream.add_bits(usized, 3).unwrap();
e_stream.add_bits(usized, 1).unwrap();
e_stream.add_bits(usized, 5).unwrap();
e_stream.add_bits(usized, 5).unwrap();

// Flush temp register, store bits into the final stream
e_stream.flush_bits();

// Close the stream and you're done (that put an endMark
// and flush the latest remainings bits from the temp
// container )
e_stream.close_stream().unwrap();

let vec: Vec<u8> = e_stream.into();

读取

读取也很简单。

// This create you a stream with a `usize` a
// temporary register
let vec: Vec<u8> = /* eluded */
let mut d_stream = Bitdstream::try_from(vec).unwrap();

// Or even from a closed (or not) encoder stream
let mut d_stream = Bitdstream::try_from(e_stream).unwrap();

// Add N bits in temp register
// ( You can go up to 64 bits on x64
//   and obviously to 32 bits if x86 )
d_stream.read_bits(3).unwrap();
d_stream.read_bits(1).unwrap();
d_stream.read_bits(5).unwrap();
d_stream.read_bits(5).unwrap();

// Flush temp register, store bits into the final stream
d_stream.reload_container();

基准测试

速度,速度,速度。

在单元测试中,你可以看到这样的代码

let buffer = Vec::with_capacity(len);
// this is randomly filled as used in tests
let mut e_stream = BitEstream::new(len + 1).unwrap();

for (i, byte) in buffer.iter().enumerate() {
    if i > 0 && i % CTNR_BYTES_SIZE == 0 {
        e_stream.flush_bits();
    }
    e_stream.add_bits(*byte as usize, BYTE_LEN).unwrap();
}
e_stream.close_stream().unwrap();

我选择在笔记本电脑上对完整的写入和读取过程进行基准测试,使用了 10kb。以下是 criterion 报告图,我得到的值与 bitstream-io crate 非常相似。使用以下命令在你的电脑上检查: cargo bench

此外,开发者!如果你正在寻找一个适用于比特流的瑞士军刀式库,你可能更适合使用 bitstream-io。所有这些都取决于你的需求 =-) (抱歉,我把这条消息放在文档的末尾)

下一步

我希望能够提供使用迭代器而不是已分配向量的可能性。目前还没有计划或里程碑。

许可证

此开发受 MIT 许可证保护,

依赖项

~130KB