Rust CRC校验库crc_all的使用:高性能CRC算法实现与多版本校验支持

Rust CRC校验库crc_all的使用:高性能CRC算法实现与多版本校验支持

支持的算法

CRC-3/GSM, CRC-3/ROHC, CRC-4/G-704, CRC-4/INTERLAKEN, CRC-5/EPC-C1G2, CRC-5/G-704, CRC-5/USB, CRC-6/CDMA2000-A, CRC-6/CDMA2000-B, CRC-6/DARC, CRC-6/G-704, CRC-6/GSM, CRC-7/MMC, CRC-7/ROHC, CRC-7/UMTS, CRC-8/AUTOSAR, CRC-8/BLUETOOTH, CRC-8/CDMA2000, CRC-8/DARC, CRC-8/DVB-S2, CRC-8/GSM-A, CRC-8/GSM-B, CRC-8/I-432-1, CRC-8/I-CODE, CRC-8/LTE, CRC-8/MAXIM-DOW, CRC-8/NRSC-5, CRC-8/OPENSAFETY, CRC-8/ROHC, CRC-8/SAE-J1850, CRC-8/SMBUS, CRC-8/TECH-3250, CRC-8/WCDMA, CRC-10/ATM, CRC-10/CDMA2000, CRC-10/GSM, CRC-11/FLEXRAY, CRC-11/UMTS, CRC-12/CDMA2000, CRC-12/DECT, CRC-12/GSM, CRC-12/UMTS, CRC-13/BBC, CRC-14/DARC, CRC-14/GSM, CRC-15/CAN, CRC-15/MPT1327, CRC-16/ARC, CRC-16/CDMA2000, CRC-16/CMS, CRC-16/DDS-110, CRC-16/DECT-R, CRC-16/DECT-X, CRC-16/DNP, CRC-16/EN-13757, CRC-16/GENIBUS, CRC-16/GSM, CRC-16/IBM-3740, CRC-16/IBM-SDLC, CRC-16/ISO-IEC-14443-3-A, CRC-16/KERMIT, CRC-16/LJ1200, CRC-16/MAXIM-DOW, CRC-16/MCRF4XX, CRC-16/MODBUS, CRC-16/NRSC-5, CRC-16/OPENSAFETY-A, CRC-16/OPENSAFETY-B, CRC-16/PROFIBUS, CRC-16/RIELLO, CRC-16/SPI-FUJITSU, CRC-16/T10-DIF, CRC-16/TELEDISK, CRC-16/TMS37157, CRC-16/UMTS, CRC-16/USB, CRC-16/XMODEM, CRC-17/CAN-FD, CRC-21/CAN-FD, CRC-24/BLE, CRC-24/FLEXRAY-A, CRC-24/FLEXRAY-B, CRC-24/INTERLAKEN, CRC-24/LTE-A, CRC-24/LTE-B, CRC-24/OPENPGP, CRC-24/OS-9, CRC-30/CDMA, CRC-31/PHILIPS, CRC-32/AIXM, CRC-32/AUTOSAR, CRC-32/BASE91-D, CRC-32/BZIP2, CRC-32/CKSUM, CRC-32/ISCSI, CRC-32/ISO-HDLC, CRC-32/JAMCRC, CRC-32/MPEG-2, CRC-32/XFER, CRC-40/GSM, CRC-64/ECMA-182, CRC-64/GO-ISO, CRC-64/WE, CRC-64/XZ, CRC-82/DARC

注意: CRC-12/UMTS 需要特殊操作。

使用

Cargo.toml 中添加 crc_all 依赖

[dependencies]
crc_all = "0.2.2"

示例

use crc_all::CrcAlgo;

fn crc11_umts(data: &[u8]) -> u16 {
    const CRC11_UMTS: CrcAlgo<u16> = CrcAlgo::<u16>::new(0x307, 11, 0, 0, false);

    let crc = &mut 0u16;
    CRC11_UMTS.init_crc(crc);
    CRC11_UMTS.update_crc(crc, data)
}

fn main() {
    assert_eq!(crc11_umts(b"123456789".as_ref()), 0x061);
}
use crc_all::Crc;

fn main() {
    let data = b"123456789".as_ref();
    let mut crc5_usb = Crc::<u8>::new(0x05, 5, 0x1f, 0x1f, true);

    assert_eq!(crc5_usb.update(data), 0x19);
    assert_eq!(crc5_usb.update(data), 0x03);

    crc5_usb.init();
    assert_eq!(crc5_usb.update(data), 0x19);
}

完整示例代码

// 引入crc_all库
use crc_all::{Crc, CrcAlgo};

// 使用CrcAlgo的示例函数
fn crc11_umts(data: &[u8]) -> u16 {
    // 定义CRC11_UMTS算法参数:多项式0x307,宽度11,初始值0,最终异或值0,不反转输入
    const CRC11_UMTS: CrcAlgo<u16> = CrcAlgo::<u16>::new(0x307, 11, 0, 0, false);

    let crc = &mut 0u16;
    CRC11_UMTS.init_crc(crc);      // 初始化CRC值
    CRC11_UMTS.update_crc(crc, data) // 更新并计算CRC
}

// 使用Crc结构体的示例函数
fn crc5_usb_example() {
    let data = b"123456789".as_ref();
    // 创建CRC5_USB实例:多项式0x05,宽度5,初始值0x1f,最终异或值0x1f,反转输入
    let mut crc5_usb = Crc::<u8>::new(0x05, 5, 0x1f, 0x1f, true);

    // 第一次计算
    let result1 = crc5_usb.update(data);
    println!("First CRC5_USB result: 0x{:02x}", result1);
    
    // 第二次计算(会基于之前的状态继续计算)
    let result2 = crc5_usb.update(data);
    println!("Second CRC5_USB result: 0x{:02x}", result2);

    // 重置CRC计算器
    crc5_usb.init();
    
    // 重新计算
    let result3 = crc5_usb.update(data);
    println!("Reset CRC5_USB result: 0x{:02x}", result3);
}

fn main() {
    // 测试CRC11_UMTS算法
    let test_data = b"123456789";
    let crc11_result = crc11_umts(test_data);
    println!("CRC11_UMTS result: 0x{:03x}", crc11_result);
    
    // 运行CRC5_USB示例
    crc5_usb_example();
    
    // 验证CRC11_UMTS结果
    assert_eq!(crc11_result, 0x061);
    println!("CRC11_UMTS test passed!");
}

许可证

可选择以下任一许可证:

  • Apache License, Version 2.0
  • MIT License

1 回复

Rust CRC校验库crc_all的使用指南

概述

crc_all是一个高性能的Rust CRC校验库,提供了多种CRC算法的实现和版本支持。该库具有以下特点:

  • 支持多种CRC算法(CRC-8、CRC-16、CRC-32等)
  • 高性能计算优化
  • 支持多种CRC参数配置
  • 提供简单易用的API接口

安装方法

在Cargo.toml中添加依赖:

[dependencies]
crc_all = "0.1"

基本使用方法

1. 计算CRC校验值

use crc_all::Crc;

fn main() {
    let data = b"Hello, world!";
    
    // 创建CRC-32计算实例
    let mut crc = Crc::<u32>::new(0x04C11DB7, 32, 0xFFFFFFFF, 0xFFFFFFFF, true);
    
    // 计算CRC值
    crc.update(data);
    let result = crc.finish();
    
    println!("CRC-32校验值: 0x{:08X}", result);
}

2. 使用预定义的CRC算法

use crc_all::CrcAlgo;

fn main() {
    let data = b"test data";
    
    // 使用预定义的CRC-16算法
    let mut crc = CrcAlgo::crc16().build();
    crc.update(data);
    let crc16_result = crc.finish();
    
    println!("CRC-16校验值: 0x{:04X}", crc16_result);
}

3. 支持多种CRC版本

use crc_all::{Crc, CrcAlgo};

fn calculate_multiple_crc(data: &[u8]) {
    // CRC-8
    let mut crc8 = CrcAlgo::crc8().build();
    crc8.update(data);
    
    // CRC-16-CCITT
    let mut crc16 = CrcAlgo::crc16ccitt().build();
    crc16.update(data);
    
    // CRC-32
    let mut crc32 = CrcAlgo::crc32().build();
    crc32.update(data);
    
    println!("CRC-8: 0x{:02X}", crc8.finish());
    println!("CRC-16-CCITT: 0x{:04X}", crc16.finish());
    println!("CRC-32: 0x{:08X}", crc32.finish());
}

4. 自定义CRC参数

use crc_all::Crc;

fn custom_crc() {
    // 自定义CRC参数:多项式、位宽、初始值、最终异或值、是否反转
    let mut crc = Crc::<u32>::new(0x1021, 16, 0xFFFF, 0x0000, false);
    
    let data = b"custom data";
    crc.update(data);
    
    println!("自定义CRC结果: 0x{:04X}", crc.finish());
}

5. 分块计算CRC

use crc_all::CrcAlgo;

fn chunked_crc_calculation() {
    let data1 = b"First part";
    let data2 = b"Second part";
    let data3 = b"Third part";
    
    let mut crc = CrcAlgo::crc32().build();
    
    // 分块更新CRC值
    crc.update(data1);
    crc.update(data2);
    crc.update(data3);
    
    let final_result = crc.finish();
    println!("分块计算CRC-32: 0x{:08X}", final_result);
}

完整示例demo

use crc_all::{Crc, CrcAlgo};

fn main() {
    // 示例数据
    let sample_data = b"Hello, this is a test message for CRC calculation!";
    
    println!("CRC计算示例:");
    println!("原始数据: {}", String::from_utf8_lossy(sample_data));
    println!();
    
    // 1. 使用预定义算法计算多种CRC
    println!("=== 使用预定义算法 ===");
    
    // CRC-8
    let mut crc8 = CrcAlgo::crc8().build();
    crc8.update(sample_data);
    println!("CRC-8: 0x{:02X}", crc8.finish());
    
    // CRC-16
    let mut crc16 = CrcAlgo::crc16().build();
    crc16.update(sample_data);
    println!("CRC-16: 0x{:04X}", crc16.finish());
    
    // CRC-32
    let mut crc32 = CrcAlgo::crc32().build();
    crc32.update(sample_data);
    println!("CRC-32: 0x{:08X}", crc32.finish());
    
    // 2. 自定义CRC参数
    println!("\n=== 自定义CRC参数 ===");
    let mut custom_crc = Crc::<u16>::new(0x1021, 16, 0xFFFF, 0x0000, false);
    custom_crc.update(sample_data);
    println!("自定义CRC-16: 0x{:04X}", custom_crc.finish());
    
    // 3. 分块计算示例
    println!("\n=== 分块计算示例 ===");
    let chunks = [
        b"First chunk of data",
        b"Second chunk of data",
        b"Third chunk of data"
    ];
    
    let mut chunked_crc = CrcAlgo::crc32().build();
    for chunk in &chunks {
        chunked_crc.update(chunk);
        println!("更新块后CRC: 0x{:08X}", chunked_crc.finish());
    }
    println!("最终CRC-32: 0x{:08X}", chunked_crc.finish());
    
    // 4. 验证数据完整性
    println!("\n=== 数据完整性验证 ===");
    let test_data = b"Important data to verify";
    let mut verifier = CrcAlgo::crc32().build();
    verifier.update(test_data);
    let original_crc = verifier.finish();
    
    println!("原始数据CRC: 0x{:08X}", original_crc);
    
    // 模拟数据被修改
    let corrupted_data = b"Important data to verify (modified)";
    let mut verifier2 = CrcAlgo::crc32().build();
    verifier2.update(corrupted_data);
    let corrupted_crc = verifier2.finish();
    
    println!("修改后数据CRC: 0x{:08X}", corrupted_crc);
    println!("数据完整性: {}", original_crc == corrupted_crc);
}

性能优化建议

  1. 对于大量数据,建议使用分块处理
  2. 重复使用Crc实例以避免重复初始化开销
  3. 选择合适的CRC算法版本以满足性能需求

注意事项

  • 确保选择的CRC算法版本与验证方一致
  • 注意字节序问题,特别是在跨平台应用中
  • 对于关键应用,建议进行额外的完整性验证

这个库提供了灵活且高性能的CRC计算功能,适用于各种需要数据完整性校验的场景。

回到顶部