首页 > 编程语言 >crc16校验C语言源码实例解析

crc16校验C语言源码实例解析

时间:2023-06-07 10:23:10浏览次数:54  
标签:crc16 CRC 16 C语言 crc init uint16 源码

一 概念:

循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

二 CRC16源码解析:

1 函数实现

#include <stdbool.h>
#include <stdlib.h>
#include <stdint.h>

#define         CRC_POLY_16             0xA001
#define         CRC_START_16            0x0000

static bool             crc_tab16_init          = false;
static uint16_t         crc_tab16[256];

/*
 * uint16_t crc_16( const unsigned char *input_str, size_t num_bytes );
 *
 * The function crc_16() calculates the 16 bits CRC16 in one pass for a byte
 * string of which the beginning has been passed to the function. The number of
 * bytes to check is also a parameter. The number of the bytes in the string is
 * limited by the constant SIZE_MAX.
 */

uint16_t crc_16( const unsigned char *input_str, size_t num_bytes )
{

        uint16_t crc;
        const unsigned char *ptr;
        size_t a;

        if ( ! crc_tab16_init ) init_crc16_tab();

        crc = CRC_START_16;
        ptr = input_str;

        if ( ptr != NULL ) for (a=0; a<num_bytes; a++) {

                crc = (crc >> 8) ^ crc_tab16[ (crc ^ (uint16_t) *ptr++) & 0x00FF ];
        }

        return crc;

}  /* crc_16 */
/*
 * static void init_crc16_tab( void );
 *
 * For optimal performance uses the CRC16 routine a lookup table with values
 * that can be used directly in the XOR arithmetic in the algorithm. This
 * lookup table is calculated by the init_crc16_tab() routine, the first time
 * the CRC function is called.
 */

void init_crc16_tab( void )
{

        uint16_t i;
        uint16_t j;
        uint16_t crc;
        uint16_t c;

        for (i=0; i<256; i++) {

                crc = 0;
                c   = i;

                for (j=0; j<8; j++) {

                        if ( (crc ^ c) & 0x0001 ) crc = ( crc >> 1 ) ^ CRC_POLY_16;
                        else                      crc =   crc >> 1;

                        c = c >> 1;
                }

                crc_tab16[i] = crc;
        }

        crc_tab16_init = true;

}  /* init_crc16_tab */

2 计算结果:

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

typedef unsigned char uint8_t;

uint8_t test_data[20];

int main()
{
        uint16_t crc_value = 0x00;
        memset(test_data,0x11,20);

        crc_value = crc_16(test_data,10);
        printf("crc_value is:0x%x \n\r",crc_value);

        return 0;
}

 

标签:crc16,CRC,16,C语言,crc,init,uint16,源码
From: https://www.cnblogs.com/dylancao/p/17462583.html

相关文章

  • C语言-状态机模式
    1.假设我们的交通信号灯控制器有以下三个状态:绿灯状态、黄灯状态和红灯状态。在绿灯状态下,我们可以选择进入黄灯状态或红灯状态。在黄灯状态下,我们等待一段时间,然后返回到红灯状态。2.Code点击查看代码#include<stdio.h>#include<unistd.h>//定义状态枚举类型typedefe......
  • 基于JAVA的springboot+vue人事管理系统、员工工资管理系统,附源码+数据库+论文+PPT
    1、项目介绍考虑到实际生活中在人事管理方面的需要以及对该系统认真的分析,将系统权限按管理员和员工这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页,个人中心,员工管理,部门管理,员工考勤管理,请假申请管理,加班申请管理,员工工资管理,招聘计划管理,员工培训管理,部......
  • 程序的编译与链接(C语言为例) #代码写好后到运行期间要经过怎样的过程呢?# 粗略版 #
    (编译与链接)前言每当我们运行一段代码时,编译器都会自动的帮我们编译代码并将代码转换为一个二进制可执行文件(.exe),有了这个可执行文件,便可以执行我们写的程序了。那么编译器对代码的编译以及生成可执行程序的过程是怎样的呢?这个问题便是本文章将要探讨的。程序的环境在A......
  • 逍遥自在学C语言 | break-循环的中断与跳转
    前言在C语言中,break语句是一种控制流语句,它用于终止当前所在的循环结构(for、while、do-while)或者switch语句,从而跳出循环或者结束switch语句的执行。一、人物简介第一位闪亮登场,有请今后会一直教我们C语言的老师——自在。第二位上场的是和我们一起学习的小白程序猿—......
  • C语言编程语法—文件读写
    一个文件,无论它是文本文件还是二进制文件,都是代表了一系列的字节。C语言不仅提供了访问顶层的函数,也提供了底层(OS)调用来处理存储设备上的文件。本章将讲解文件管理的重要调用。打开文件您可以使用fopen()函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型FIL......
  • 关于C语言题602
    1、编写函数voidcount(chara[],charw[][10],intn,intb[])。功能是:统计w指向的数组中的n个单词在a指向的字符串中各自出现的次数(将非字母字符看作单词分割符),拧将统计结果依次保存在b指向的数组中。 #include<stdio.h>#include<string.h>#defineN10intmain(){......
  • Mysql5.6.10源码安装步骤
    Mysql5.6.10源码安装步骤//MySQL5.6.10源码安装步骤: 系统环境:CentOS5.6 MySQL版本:mysql-5.6.10.tar.gz 安装路径:/usr/local/mysql 数据目录:/data/mysql/data CentOS5.6下MySQL5.6源码安装 Linux操作系统:CentOS5.61:下载:当前mysql版本到了5.6.10 下载地址:ht......
  • flink源码分析--RPC通信过程分析
    flink的通信框架基于akka,但是不懂akka也关系不大。首先介绍几个概念,大家记住名字和对应的作用:xxxGateway:在flink中就是一个用来告诉调用者,xxx具有哪些方法可以调用的一个接口类。比如JobMasterGateway就是用来告诉所有需要调用JobMaster的用户,我JobMaster类只有比如10个方法,假设......
  • AQS源码详解
    AQS源码详解可重入锁:同一个线程可重复获取同一把锁对象locksupport:用来创建锁和其他同步类的基本线程阻塞原语park()和unpark()为什么会引出locksupport?像传统的synchorized和lock,他们的wait()和notify()方法,await()和singal()方法使用不方便,必须在同步代码块或者锁内使用,并......
  • Elasticjob 3.x 最新版本源码解读
    源码地址(含备注):https://gitee.com/ityml/elastic-job-zgc官方网站:https://shardingsphere.apache.org/elasticjob/ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管......