#matching #bitpacking #binary #decoder #macro #bindings

无 std bitmatch

一个宏,允许匹配、绑定和打包整数的各个位

2 个版本

0.1.1 2020 年 3 月 21 日
0.1.0 2020 年 1 月 20 日

#9 in #bitpacking

Download history 679/week @ 2024-03-14 858/week @ 2024-03-21 806/week @ 2024-03-28 730/week @ 2024-04-04 899/week @ 2024-04-11 1123/week @ 2024-04-18 805/week @ 2024-04-25 1019/week @ 2024-05-02 830/week @ 2024-05-09 973/week @ 2024-05-16 866/week @ 2024-05-23 814/week @ 2024-05-30 671/week @ 2024-06-06 616/week @ 2024-06-13 747/week @ 2024-06-20 862/week @ 2024-06-27

3,014 每月下载次数
用于 11 个 crate(直接使用 3 个)

MPL-2.0 许可证

24KB
428 代码行

Bitmatch

Crates.io Library Version Number Crates.io Library License Docs.rs Documentation Version Number

bitmatch crate 提供了用于将整数打包和拆包为位序列的工具。支持 #![no_std]

示例

使用 #[bitmatch]let 拆包,将位拆分为每个字母单独的单字符变量。

使用 bitpack!() 将这些单字符变量重新打包成一个整数。

use bitmatch::bitmatch;

#[bitmatch]
fn interleave(n: u8) -> u8 {
    #[bitmatch]
    let "xxxx_yyyy" = n;
    bitpack!("xyxy_xyxy")
}

fn main() {
    assert_eq!(interleave(0xF0), 0xAA);
}

您还可以在 match 上使用 #[bitmatch],它将确保字面部分匹配,并绑定变量部分。

use bitmatch::bitmatch;
#[bitmatch]
fn decode(inst: u8) -> String {
    #[bitmatch]
    match inst {
        "00oo_aabb" => format!("Op {}, {}, {}", o, a, b),
        "0100_aaii" => format!("Val {}, {}", a, i),
        "01??_????" => format!("Invalid"),
        "10ii_aabb" => format!("Ld {}, {}, {}", a, b, i),
        "11ii_aabb" => format!("St {}, {}, {}", a, b, i),
    }
}

依赖关系

~2MB
~47K SLoC