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
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);
}
性能优化建议
- 对于大量数据,建议使用分块处理
- 重复使用Crc实例以避免重复初始化开销
- 选择合适的CRC算法版本以满足性能需求
注意事项
- 确保选择的CRC算法版本与验证方一致
- 注意字节序问题,特别是在跨平台应用中
- 对于关键应用,建议进行额外的完整性验证
这个库提供了灵活且高性能的CRC计算功能,适用于各种需要数据完整性校验的场景。