3 个版本
0.1.2 | 2022 年 8 月 2 日 |
---|---|
0.1.1 | 2022 年 7 月 27 日 |
0.1.0 | 2022 年 7 月 27 日 |
#3 in #bit-level
16KB
125 行
bit_buffers
bit_buffers
库允许读写文件中的单个位。
该库提供了位读取实体和位写入实体的原型版本,它们都跟踪包含的位数以及当前使用的位。
示例用法(向文件写入位)
如果您想将一串位保存到文件中,请使用 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位数据,可能需要重新分配。添加允许用户预留预期空间的功能,可以随着时间的推移分摊读取和写入位的成本。
- 额外功能
目前,用户无法对缓冲区进行索引以读取特定位或覆盖位。