crc16校验C语言源码实例解析
一 概念:
循环冗余码校验英文名称为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校验C语言源码实例解析的更多相关文章
- mybatis 3.x源码深度解析与最佳实践(最完整原创)
mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...
- spring源码深度解析— IOC 之 容器的基本实现
概述 上一篇我们搭建完Spring源码阅读环境,spring源码深度解析—Spring的整体架构和环境搭建 这篇我们开始真正的阅读Spring的源码,分析spring的源码之前我们先来简单回顾下spr ...
- spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
@Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...
- Spring框架之beans源码完全解析
导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...
- Spring框架之spring-web web源码完全解析
Spring框架之spring-web web源码完全解析 spring-web是Spring webMVC的基础,由http.remoting.web三部分组成,核心为web模块.http模块封装了 ...
- Spring框架之spring-webmvc源码完全解析
Spring框架之spring-webmvc源码完全解析 Spring框架提供了构建Web应用程序的全功能MVC模块.Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,支持多种 ...
- spring源码深度解析— IOC 之 默认标签解析(下)
在spring源码深度解析— IOC 之 默认标签解析(上)中我们已经完成了从xml配置文件到BeanDefinition的转换,转换后的实例是GenericBeanDefinition的实例.本文主 ...
- Caddy 源码全解析
caddy源码全解析 Caddy 源码全解析 Preface Caddy 是 Go 语言构建的轻量配置化服务器.同时代码结构由于 Go 语言的轻便简洁,比较易读,推荐学弟学妹学习 Go 的时候也去查看 ...
- (一) Mybatis源码分析-解析器模块
Mybatis源码分析-解析器模块 原创-转载请说明出处 1. 解析器模块的作用 对XPath进行封装,为mybatis-config.xml配置文件以及映射文件提供支持 为处理动态 SQL 语句中的 ...
- mybatis源码配置文件解析之二:解析settings标签
在前边的博客中分析了mybatis解析properties标签,<mybatis源码配置文件解析之一:解析properties标签>.下面来看解析settings标签的过程. 一.概述 在 ...
随机推荐
- libuv计时器
目录 1.uv_timer_t - 计时器句柄 2.API 2.1.uv_timer_init 2.2.uv_timer_start 2.3.uv_timer_stop 2.4.uv_timer_ag ...
- centos6.5安装MongoDB4.4.23
前言 1.目前MongoDB最新稳定版本是:6.0.8 2.MongoDB 5+和6+版本已不支持centos6.2+系统,参考https://docs.mongoing.com/install-mo ...
- Git 简明教程(一)
版本控制工具,早期的vss tfs svn等,这些应该是老一辈程序员常用的工具.目前 git 已经在版本控制领域占主流的地位,因为国外的github 和国内的码云 gitee 均用的是git. git ...
- SqlDapperEasyUtil:.NET CORE下的Dapper封装操作类
之前介绍了基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,这个在.NET FX下还是比较好用的,现在都流行.NET CORE,故我这边再次进行精简修改,以便适应.NET ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(下)
集成测试 集成测试能够确保应用程序的组件正常工作,包括应用程序支持的基础结构,如数据库和文件系统等 进行集成测试时,应为项目添加 Microsoft.AspNetCore.MvcTesting 包 它 ...
- 2022年3月核心库MySQL优化总结
2021年9月底到新公司,公司核心数据库,以前无专业DBA维护,问题多,隐患大,到2022年2月持续后,优化至今: 优化大项: 1,从1主3从,扩容到1主5从,将部分读放都另外新加从库 2,最大表 ...
- Spring Boot图书管理系统项目实战-11.检索图书
导航: pre:10.借还统计 next: 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 index.html <!D ...
- Java使用ConcurrentHashMap实现简单的内存式缓存
需求说明: 实际项目中我打算把用户和组织信息放到缓存中,基于此提出以下几点需求: 1.数据存储在内存中: 2.允许以键值对的方式存储对象类数据并带有过期策略: 3.不限制内存使用,但cache也不能给 ...
- 我在winform项目里使用“Windows I/O完成端口”的经验分享
少年!看你骨骼惊奇,是万中无一的练武奇才,我这儿有本武林秘籍,见与你有缘就送你了! 如来神掌 Windows I/O完成端口是一个我至今都说不好的话题,请宽容的接受我这不是科班出身的自学成才的野生程序 ...
- 阿里云 SMS 短信 Java SDK 封装
Github & Issues: https://github.com/cn-src/aliyun-sms 官方文档:https://help.aliyun.com/document_deta ...