概念

  CRC校验算法,说白了,就是把需要校验的数据与多项式进行循环异或(XOR), 进行XOR的方式与实际中数据传输时,是高位先传、还是低位先传有关。对于数据

高位先传的方式,XOR从数据的高位开始,我们就叫它顺序异或吧;对于数据低位先传的方式,XOR从数据的低位开始,我们就叫它反序异或吧。两种不同的异或方式, 即使

对应相同的多项式,计算出来的结果也是不一样的。

实例解析

  两种不同类型的写法:

#include <stdio.h>

typedef unsigned char uint8_t;

uint8_t gencrc(uint8_t *data, size_t len)
{
uint8_t crc = 0xff;
size_t i, j;
for (i = 0; i < len; i++) {
crc ^= data[i];
for (j = 0; j < 8; j++) {
if ((crc & 0x80) != 0)
crc = (uint8_t)((crc << 1) ^ 0x31);
else
crc <<= 1;
}
}
return crc;
}
/*
crc8 poly = 0x107 (x8+x2+x1+1)
*/
uint8_t crc8(uint8_t *data, int size)
{
uint8_t crc = 0x00;
uint8_t poly = 0x07;
int bit; while (size--)
{
crc ^= *data++;
for (bit = 0; bit < 8; bit++)
{
if (crc & 0x80)
{
crc = (crc << 1) ^ poly;
}
else
{
crc <<= 1;
}
}
} return crc;
} int main()
{
uint8_t data[8] = {0xBE,0xEF,0,0,0,0,0,0};
uint8_t datab[8] = {0xBE,0xEF,2,0,0,0,0,0};
uint8_t crc,crcb;
crc = gencrc(data, 8);
crcb = gencrc(datab, 8);
printf("first crc:\n");
printf("crc:0x%1x crcb:0x%x \n", crc,crcb); crc = crc8(data, 8);
crcb = crc8(datab, 8);
printf("second crc:\n");
printf("crc:0x%1x crcb:0x%x \n", crc,crcb); crc = gencrc(data+2, 1); /* returns 0xac */
printf("%1x\n", crc);
return 0;
}

  参数不同结果:

first crc:
crc:0xc7 crcb:0x69
second crc:
crc:0x83 crcb:0xd1
ac

CRC校验算法的实例解析的更多相关文章

  1. CRC校验算法学习

    原文:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 本文根据上述链接原文翻译而来,如有错误,忘广大网友互相帮忙纠正,谢谢! 1.前言: 1.0 ...

  2. CRC校验算法详解

    CRC(Cyclic Redundancy Check)循环冗余校验是常用的数据校验方法,讲CRC算法的文章很多,之所以还要写这篇,是想换一个方法介绍CRC算法,希望能让大家更容易理解CRC算法. 先 ...

  3. CRC校验算法

    typedef unsigned char UCHAR;typedef unsigned char BOOL; /* 计算cnt字节数据的crc,最后一个字节的低7比特必须是0,实际上求的是(cnt× ...

  4. [jnhs]全套CRC校验 算法

    摘自 https://blog.csdn.net/cp1300/article/details/51443350 uint8_t crc4_itu(uint8_t *data, uint_len le ...

  5. 数据帧CRC32校验算法实现

    本文设计思想采用明德扬至简设计法.由于本人项目需要进行光纤数据传输,为了保证通信质量要对数据进行校验.在校验算法中,最简单最成熟的非CRC校验莫属了. 得出一个数的CRC校验码还是比较简单的: 选定一 ...

  6. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...

  7. Java CRC16 MODBUS校验算法实现

    /** * CRC校验算法工具类 */ public class CRCUtil { public static String getCRC(String data) { data = data.re ...

  8. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  9. 常用校验算法CRC、MD5、SHA_转

    1.算法概述 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(H ...

随机推荐

  1. 【MySQL】数据库课程实验

    数据定义 #mysql --version 查版本号 #mysql -uroot -p #登录 show databases; #查询当前服务存在的数据库 #create database test ...

  2. C语言博客作业11

    一.本周教学内容&目标 第5章 函数 要求学生掌握各种类型函数的定义.调用和申明,熟悉变量的作用域.生存周期和存储类型. 二.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...

  3. $("#loginname").tips和jQuery中 的ajax

    jquery tips 提示插件 jquery.tips.js v0.1beta: 使用方法 $("#loginname").tips({ //#loginname为jquery的 ...

  4. spring源码学习五 - xml格式配置,如何解析

    spring在注入bean的时候,可以通过bean.xml来配置,在xml文件中配置bean的属性,然后spring在refresh的时候,会去解析xml配置文件,这篇笔记,主要来记录.xml配置文件 ...

  5. 【搞定面试官】try中有return,finally还会执行吗?

    本篇文章我们主要探讨 一下如果try {}语句中有return,这种情况下finally语句还会执行吗?其实JVM规范是对这种情况有特殊规定的,那我就先上代码吧! public class Final ...

  6. 免费试用 | 多模 NoSQL 服务GeminiDB for Cassandra 全球首发

    PS:多模NoSQL服务GeminiDB重磅公测,免费体验,参与公测还有华为AI音响好礼相送~ 7月5日,华为云多模 NoSQL 服务GeminiDB for Cassandra正式对外定向邀测.华为 ...

  7. 升级xcode10.0, 终端运行 运行报错:Print: Entry, “:CFBundleIdentifier”, Does Not Exist

    目录 问题原因 解决方法 终端解决 Print: Entry, ":CFBundleIdentifier", Does Not Exist 第一步: 去官网GitHub下载对应包就 ...

  8. Xcode10.0: NO BUNDLE URL PRESENT

    目录 解决方案 1.删除build, 重新运行, 没有work 2.删除node_modules, npm i, 重新运行, 没有work 3.删除端口占用 4.代理设置, 可能work了 解决方案 ...

  9. servlet登录练习,并且记录访问次数

    Userservlet登录数据处理,包括访问页面次数处理: package com.szxy.test; import java.io.IOException; import javax.servle ...

  10. nbuoj2784 倒水

    题目:http://www.nbuoj.com/v8.83/Problems/Problem.php?pid=2784 一天,TJ买了N个容量无限大的瓶子,开始时每个瓶子里有1升水.接着TJ决定只保留 ...