crc 校验

1. 概述:
该demo主要实现crc校验
引用crc库的地址为:https://github.com/whik/crc-lib-c

2. 测试:
在这里插入图片描述

/*
    From : https://github.com/paiminlin/PM
    From : https://blog.youkuaiyun.com/lpaim/article/details/125467345
    Author : PaiMin.lin
    Date : 2022.8.21
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#include "crcLib.h"

#ifdef __cplusplus
extern "C"{
   
   
#endif

#define Democrc_MAIN_DEBUG
#ifdef Democrc_MAIN_DEBUG

int main() {
   
   

    char str[16] = "Hello World!";

    printf("crc4_itu\t \"%s\" = 0x%0X\n", str, crc4_itu((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc5_epc\t \"%s\" = 0x%0X\n", str, crc5_epc((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc5_itu\t \"%s\" = 0x%0X\n", str, crc5_itu((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc5_usb\t \"%s\" = 0x%0X\n", str, crc5_usb((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc6_itu\t \"%s\" = 0x%0X\n", str, crc6_itu((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc7_mmc\t \"%s\" = 0x%0X\n", str, crc7_mmc((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc8\t\t \"%s\" = 0x%0X\n", str, crc8((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc8_itu\t \"%s\" = 0x%0X\n", str, crc8_itu((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc8_rohc\t \"%s\" = 0x%0X\n", str, crc8_rohc((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc8_maxim\t \"%s\" = 0x%0X\n", str, crc8_maxim((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_ibm\t \"%s\" = 0x%0X\n", str, crc16_ibm((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_maxim\t \"%s\" = 0x%0X\n", str, crc16_maxim((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_usb\t \"%s\" = 0x%0X\n", str, crc16_usb((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_modbus\t \"%s\" = 0x%0X\n", str, crc16_modbus((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_ccitt\t \"%s\" = 0x%0X\n", str, crc16_ccitt((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_ccitt_false\t \"%s\" = 0x%0X\n", str, crc16_ccitt_false((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_x25\t \"%s\" = 0x%0X\n", str, crc16_x25((uint8_t *)str, (uint16_t)(strlen(str))));
    printf("crc16_xmodem\t \"%s\" = 0x%0X\n", str, crc16_xmodem((uint8_t *)str, (uint16_t
1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。   2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。   3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得   V(x)=A(x)g(x)=xRm(x)+r(x);   其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,   g(x)称为生成多项式:   g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR   发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。   4、CRC校验码软件生成方法:   借助于多项式除法,其余数为校验字段。   例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1   假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001   x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;   采用多项式除法: 得余数为: 1010 (即校验字段为:1010)   发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10   信息字段 校验字段   接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)   如果能够除尽,则正确,
为了实现和验证CRC校验码,需要理解CRC的基本原理和具体算法CRC(循环冗余校验)是一种用于检测数据完整性的校验方法,通常通过多项式除法来计算校验码。以下是一个通用的实现步骤和示例代码: ### CRC-32算法实现 CRC-32是最常用的CRC算法之一,广泛用于压缩工具(如WinRAR、ZIP)和网络通信中。它的多项式为 $ G(x) = x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 $,对应的十六进制表示为 `0xEDB88320`。 #### Python实现CRC-32校验码 以下是一个Python实现的CRC-32校验码计算示例: ```python def crc32(data): # 初始化CRCcrc_table = [0] * 256 for i in range(256): crc = i for _ in range(8): if crc & 1: crc = (crc >> 1) ^ 0xEDB88320 else: crc >>= 1 crc_table[i] = crc # 初始CRCcrc = 0xFFFFFFFF # 计算CRC for byte in data: crc = (crc >> 8) ^ crc_table[(crc ^ byte) & 0xFF] # 取反得到最终CRC值 return crc ^ 0xFFFFFFFF # 示例数据 data = b"Hello, World!" crc_value = crc32(data) print(f"CRC-32校验码: {hex(crc_value)}") ``` ### CRC-16算法实现 CRC-16常用于磁盘驱动器的读写操作,其多项式为 $ G(x) = x^{16} + x^{15} + x^2 + 1 $,对应的十六进制表示为 `0x8005`。 #### Python实现CRC-16校验码 以下是一个Python实现的CRC-16校验码计算示例: ```python def crc16(data): # 初始化CRCcrc_table = [0] * 256 for i in range(256): crc = i << 8 for _ in range(8): if crc & 0x8000: crc = (crc << 1) ^ 0x8005 else: crc <<= 1 crc_table[i] = crc & 0xFFFF # 初始CRCcrc = 0 # 计算CRC for byte in data: crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte] return crc # 示例数据 data = b"Hello, World!" crc_value = crc16(data) print(f"CRC-16校验码: {hex(crc_value)}") ``` ### CRC-CCITT算法实现 CRC-CCITT用于X.25协议的FCS(帧检错序列),其多项式为 $ G(x) = x^{16} + x^{12} + x^5 + 1 $,对应的十六进制表示为 `0x1021`。 #### Python实现CRC-CCITT校验码 以下是一个Python实现的CRC-CCITT校验码计算示例: ```python def crc_ccitt(data): # 初始化CRCcrc_table = [0] * 256 for i in range(256): crc = i << 8 for _ in range(8): if crc & 0x8000: crc = (crc << 1) ^ 0x1021 else: crc <<= 1 crc_table[i] = crc & 0xFFFF # 初始CRCcrc = 0xFFFF # 计算CRC for byte in data: crc = (crc << 8) ^ crc_table[(crc >> 8) ^ byte] return crc # 示例数据 data = b"Hello, World!" crc_value = crc_ccitt(data) print(f"CRC-CCITT校验码: {hex(crc_value)}") ``` ### CRC校验码验证 在接收端,验证CRC校验码的方法与计算过程类似。接收端会使用相同的算法和多项式对数据进行CRC计算,并与接收到的CRC值进行比较。如果两者一致,则说明数据未被损坏;否则,数据可能在传输过程中发生了错误。 ### 总结 CRC校验码的实现依赖于具体的多项式选择和算法步骤。通过上述示例代码,可以快速实现CRC-32、CRC-16和CRC-CCITT校验码的计算和验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值