#binary-data #bit #binary #extract #data-source

bitlab

从二进制数据源提取一系列比特位

24个版本 (2个稳定版)

1.1.0 2021年8月9日
1.0.0 2020年5月29日
0.8.2 2019年1月21日
0.8.1 2018年3月15日
0.4.1 2017年11月28日

#749 in 数据结构

Download history 136/week @ 2024-01-02 133/week @ 2024-01-09 86/week @ 2024-01-16 88/week @ 2024-01-23 250/week @ 2024-01-30 258/week @ 2024-02-06 171/week @ 2024-02-13 177/week @ 2024-02-20 299/week @ 2024-02-27 149/week @ 2024-03-05 87/week @ 2024-03-12 288/week @ 2024-03-19 163/week @ 2024-03-26 131/week @ 2024-04-02 112/week @ 2024-04-09 247/week @ 2024-04-16

699 每月下载量

MIT 许可证

170KB
2.5K SLoC

Travis Build Status Build status Latest Version

目标

从二进制数据源中提取一系列比特位,或将一系列比特位插入到二进制数据结构中

状态

被动维护

文档

此crate发布在 crates.io。详细文档可在 docs.rs/bitlab 查找

版本

1.1.0

示例1

从比特偏移1开始,提取3个比特位,并将结果解释为u8

use bitlab::*;
let a: i8 = -33; // = 0b1101_1111;
let b = a.get_u8(1, 3).unwrap();  // 1 --> 101 <-- 1111
//                                         = 5
assert_eq!(b, 5);

示例2

use bitlab::*;
let a: u8 = 0b0000_0101;

// Get the most significant bit. It has the bit offset 0
assert_eq!(a.get_bit(0).unwrap(), false);

// Set the most significant bit. Expect 0b1000_0101
assert_eq!(a.set_bit(0).unwrap(), 133);

// Clear the most significant bit. Expect 0b0000_0101
assert_eq!(a.clear_bit(0).unwrap(), 5);

示例3

数据源是一个u8类型的向量。我们希望跳转到字节偏移1,比特偏移7,并从那里提取3个比特位作为u16

use bitlab::*;
let v: Vec<u8> = vec!{ 0x48, 0x61, 0x6C, 0x6C, 0x6F }; // = "Hallo"
let bar = v.get_u16(1, 7, 3); // relevant bytes = 0x616C = 0b0110_000  --> 1_01 <-- 10_1100
//                                                                         = 5
assert_eq!(bar.unwrap(), 5);

示例4

将一个2位无符号整数值(b = 3)插入到从比特偏移1开始的变量中,其中偏移量=零是最高有效位。

use bitlab::*;
let a : u8 = 0;
let b : u8 = 3;
assert_eq!(a.set(1, 2, b).unwrap(), 0b0110_0000);

示例5

从u8中取出值3(只有2位=0b11),将其插入到字节偏移=1和比特偏移=15的向量中

use bitlab::*;
let a : u8 = 3; // = 0b0000_0011
let mut v: Vec<u8> = vec!{ 0x48, 0x61, 0x6C, 0x6C, 0x6F };
// relevant bytes = 0x6C_6C = 0b0110_110 --> 0_0 <-- 110_1100
let bar = v.set(1, 15, 2, a);
assert_eq!(v[2], 0b0110_1101);
assert_eq!(v[3], 0b1110_1100);

示例6

示例目录中有一个非常简单的应用,用于从实际的gif文件中提取颜色分辨率。要运行它,请在命令行中输入以下内容

cargo run --release --example gif

依赖

~245KB