#bit #binary-file #buffer #reading #read #bit-level #bit-writer

bin+lib bit_buffers

用于读写文件中单个位的库

3 个版本

0.1.2 2022 年 8 月 2 日
0.1.1 2022 年 7 月 27 日
0.1.0 2022 年 7 月 27 日

#3 in #bit-level

MIT/Apache

16KB
125

bit_buffers

bit_buffers 库允许读写文件中的单个位。

doc tests

该库提供了位读取实体和位写入实体的原型版本,它们都跟踪包含的位数以及当前使用的位。

示例用法(向文件写入位)

如果您想将一串位保存到文件中,请使用 BitWriter。

// main.rs
use bit_buffers::BitWriter;

fn main() {

    // Create the writer
    let mut bit_writer = BitWriter::new();

    // Write out the desired bits
    bit_writer.write_bit(1);
    bit_writer.write_bit(0);
    bit_writer.write_bit(1);
    bit_writer.write_bit(1);
    bit_writer.write_bit(1);
    bit_writer.write_bit(1);
    bit_writer.write_bit(0);
    bit_writer.write_bit(1);

    // Save the bits to a file and clear out this writer
    bit_writer.flush_to_file("bit_sequence.bit");

}

示例用法(从文件读取位)

稍后,如果您想以写入时的顺序读取这些相同的位,请使用 BitReader。BitReader 以 Option 形式返回每个位,允许读者在读取最后一个位后返回 None。

// main.rs
use bit_buffers::BitReader;

fn main() {

    // Load bits in from the file
    let mut bit_reader = BitReader::new();
    bit_reader.load_from_file("bit_sequence.bit");

    // Read those bits in from the file
    let bit_1_option = bit_reader.read_bit();
    let bit_2_option = bit_reader.read_bit();
    let bit_3_option = bit_reader.read_bit();
    let bit_4_option = bit_reader.read_bit();
    let bit_5_option = bit_reader.read_bit();
    let bit_6_option = bit_reader.read_bit();
    let bit_7_option = bit_reader.read_bit();
    let bit_8_option = bit_reader.read_bit();


    // After the last bit, None is returned
    let bit_9_option = bit_reader.read_bit();

    // Try and print the 9th bit
    if let Some(_) = bit_9_option {
        println!("There might still be more!");
    } else {
        println!("All bits were read in from the file!");
    }
}

二进制文件格式

使用简单格式将位写入文件

  • 位数
  • 位数据

底层使用 u128 类型变量来计数文件中的位数。至于字节序,端序由用户系统确定。

在写入实际的位数据时,最多可能有 7 个额外的填充位,这些位不计入总数。

当使用 BitReader 时,最好使用 BitWriter 生成的文件,除非您愿意编写一个正确格式描述所需信息的文件。

示例位文件

考虑上面演示使用 BitWriter 的示例程序。在调用 bit_writer.flush_to_file("bit_sequence.bit") 之后,将生成以下二进制文件。

08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 BD

在十六进制编辑器中查看时,该二进制文件可能如下所示。

00000000    08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010    BD

未来目标

- 线程安全

截至目前,该库尚未在多线程应用程序中进行测试。BitReader 和 BitWriter 目前都不能保证线程安全。

- 可共享性

当从和向文件读写位时,用户系统确定端序。这可能在尝试通过网络共享位文件时引起问题。一个未来的目标是标准化写入和读取此类文件中的位数的方式。

- 优化

当位被写入 BitWriter 时,它们直接写入内部字节的向量。目前的代码很混乱且容易出错。添加一个额外的缓冲区可能会简化底层逻辑。

此外,对于每写入8位数据,可能需要重新分配。添加允许用户预留预期空间的功能,可以随着时间的推移分摊读取和写入位的成本。

- 额外功能

目前,用户无法对缓冲区进行索引以读取特定位或覆盖位。

无运行时依赖