CRC目前是在数据通信和计算机网络中应用最广泛的一种校验编码方式。它的原理十分简单但非常使用,具体内容可自行百度,下面主要讲一下我的代码的算法:
先来一组名字解释:
Gx:生成码,这个是可以人为设定的,它就是CRC里面所谓的生成多项式对应的系数。
Kx:信息码,就是指要发送的信息,是一组1、0组合的字符串(当然可以看作是整数,或者浮点数等,在我的程序里是把它看作字符串的,长度可以自定)。
Tx:指真正发送出去的码字
Rx:指冗余码。
再来回顾一下它们之间的关系(举例说明),如果:
Kx=110011,Gx=11001;根据CRC运算规则可以算出Rx=1001,所以Tx=1100111001。
下面分段解释一下我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>//#define CRC_CCITT 69665
//#define CRC_16 98309
//#define CRC_12 6159
#define DEC 2 //用于控制输出数据的进制表示,默认输出二进制

头文件没什么好说的,注释掉的那三行是国际标准下的Gx转化为十进制的值,最后一行是用来控制输出形式的,如果想把结果表示为十六进制输出,将2改为16即可。

unsigned btoi(char pt[])  //此函数用来把二进制字符串转化为十进制整数
{int le=0,i;unsigned sum=0;le=strlen(pt);for(i=0;i<le;i++){if(pt[i]=='1')sum=sum+(unsigned)(pow(2,le-1-i)); //注释(一)}return sum;
}
///分界线///unsigned CRC_Calc(unsigned *Kx,unsigned Gx)  //此函数用于计算十进制的冗余码
{int bi=0;char bu[32];itoa(Gx,bu,2);bi=strlen(bu);*Kx=(*Kx)*(unsigned)pow(2,bi-1);//注释(二)return Gx-(*Kx%Gx);
}

在上面两个函数中:第一个是进制转换函数,形参为字符串表示的二进制数据,函数返回十进制数据;后一个函数,是用于计算冗余码的,计算结果用十进制数据表示(两个函数都只能操作无符号整数),该函数形参为信息码的地址(因为要修改其值,而且要返回冗余码值)和生成码。其中函数itoa()是C语言的一个库函数(对应的头文件是stdlib.h)意为:intergrate to ascii,就是把十进制的整数转化为其他进制的、ASCII表示的字符串,转化为几进制由最后一个形参决定。
注释(一):根据二进制转化为十进制的计算方法,这一步就是把某一位不为0的权值先算出来在加到总和里面;
注释(二):这一步就是K(x)*x^r,见下图:

下面看主函数:

int main()
{int f=1;  //f表示flag,用于决定是否继续测试unsigned g,k,s,r; //分别意为:Gx,Kx,Tx,Rxchar se[32],rx[32],gi[32],ki[32];while(f) {system("cls"); //清屏函数fflush(stdin); //清空缓冲区/* ************ 十进制输入*********************///        printf("请输入十进制信息码:\n");
//        scanf("%d",&k);
//        itoa(k,ki,DEC);
//        printf("请输入十进制生成码:\n");
//        scanf("%d",&g);
//        itoa(g,gi,DEC);
/* ****************二进制输入*********************** */printf("请输入二进制信息码:\n");gets(ki);k=btoi(ki);printf("请输入二进制生成码:\n");gets(gi);g=btoi(gi);// ------------------------------分界线-----------------------------------     //r=CRC_Calc(&k,g);s=r+k;itoa(r,rx,DEC);itoa(s,se,DEC);printf("生成码(Gx):%s\n",gi);printf("信息码(Kx):%s\n",ki);printf("发送码(Tx):%s\n",se);printf("冗余码(Rx):%s\n",rx);if(s%g==0)     注释(一)/{printf("\n\tAcceptable!\n");}else{printf("\n\tUnacceptable!\n");}printf("\n是否继续(1=是,0=否)\n");scanf("%d",&f);}return 0;
}

上面的代码中:输出方式有两种,默认是二进制输入,当然可以选择十进制输入(下面会放图展示二者的区别),注释(一)以后的代码是对结果的验证,如果验证成功会打印出“Acceptable!”,否者会打印出“Unacceptable”。
下面看一下两种不同输入的区别:

总结:本段代码里面的计算方式与某些教科书上的计算方式有所区别,当然本人只是用C语言模拟运算一下,如有疑问、意见或者建议,欢迎大家指出!

由于本篇循环校验实现的方法不是严格按照书本上的实现,所以后面我又补充了另外一篇完全按照书本上要求实现的算法,到这里查看。

循环冗余校验(CRC)——C语言版相关推荐

  1. [2021.07.25更新]循环冗余校验(CRC)的MATLAB实现

    欢迎同步关注公众号[逆向通信猿] CRC校验(循环冗余校验) 在计算CRC校验的时候,发现一个网站如下 http://www.ip33.com/crc.html 于是,想自己动手实现该网站计算CRC校 ...

  2. 2.1.5-3 循环冗余校验(CRC)码

    想必是雪乞春华 (҂◔∀◐҂)☆万圣节快乐♬☆◥(ฅº₩ºฅ)◤ 不给糖就捣蛋 ☆(●⁰౪⁰●)没钱(*^3^)/-☆ 中午我们要学习最后一种校验码叫做循环冗余校验码英文缩写叫CrC码,这给出了他的英 ...

  3. 循环冗余校验-CRC

    一.简介 CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验.它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制.实际上 ...

  4. CRC循环冗余校验(计算机网络)

    CRC循环冗余校验 CRC差错检验的过程 提要 CRC的具体过程 例题详解 CRC差错检验的过程 提要  数据在链路层进行传输时,为了保证接收到的数据比特流是准确无误的,会采用CRC循环冗余校验的方式 ...

  5. crc循环冗余校验 php,crc 循环冗余校验

    --- title: crc 循环冗余校验 date: 2018-09-26 updated: 2018-10-06 --- # crc 循环冗余校验 CRC(Cyclic Redundancy Ch ...

  6. 一文详解循环冗余校验校验算法(CRC校验)及C语言代码的实现 ---- 以CRC-16/MODBUS为例讲解

    一.概述 现在的产品开发过程中,无论是数据的储存还是传输,都需要确保数据的准确性,所以就需要在数据帧后面附加一串校验码,方便接收方使用校验码校验接收到的数据是否是正确的. 常用的校验方式有奇偶校验.异 ...

  7. c语言累加和校验_循环冗余校验(CRC)算法入门

    http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...

  8. CRC冗余校验码源码代码c语言,循环冗余校验码(CRC)应用总结(包括C++源码)

    最近在实习期间需要用到数据的校验,所选为CRC16,那么就在此总结一番吧. 现在此说明下什么是CRC:循环冗余码校验 英文名称为Cyclical Redundancy Check,简称CRC,它是利用 ...

  9. 第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 [计算机组成原理笔记]

    第二章 数据的表示和运算 2.1.6 循环冗余校验码/CRC码 本笔记参考书目: 计算机组成原理(第六版.立体化教材)白中英.戴志涛 2021王道计算机组成原理视频公开课 本节重点: 循环冗余校验码/ ...

  10. 计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

    笔者在阅读华中科技大学谭志虎老师主编的<计算机组成原理(微课版)>教材进行复习时,产生了一个疑问,并针对性地进行了一些思考.欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗, ...

最新文章

  1. 4.2 深层网络中的前向传播-深度学习-Stanford吴恩达教授
  2. 1、MySQL性能优化简述
  3. python中类怎么理解_Python中的列表理解
  4. 【转】 PDO使用归纳【PHP】
  5. tcc分布式事务框架源码解析系列(四)之项目实战
  6. 线程之线程同步(1)
  7. 互联网搜索 解决问题的心法 找什么 哪里找 怎么找
  8. sql 查找重复值,整行重复
  9. 兆骑科创创业大赛,线上直播路演,高层次人才引进服务平台
  10. 构建nas_我的第一个diy nas服务器构建
  11. R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行升序排序(ASCENDING)
  12. 泛泰升级包下载工具Windows版介绍_下载_使用说明_编写原理[2014.3.24更新v0.3]
  13. 【二十】 H.266/VVC | 仿射运动估计AMVP继承相邻块的运动信息函数 | addAffineMVPCandUnscaled函数
  14. 一个简单的方法修复ubuntu引导损坏
  15. 今日头条:注册头条号3-7天就度过,掌握这四个关键点
  16. bootstrap网格系统
  17. java蓝桥杯练习 幸运数
  18. 两相四线步进电机的驱动方法/驱动芯片用法
  19. 下一个马克·扎克伯格会是人工智能吗?
  20. 手把手教学RRT三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

热门文章

  1. 什么软件可以测试自己王者本命英雄,王者荣耀本命英雄测试入口在哪2021
  2. OpenCV与Open3D等开源视觉库的详细笔记
  3. 免费台球计费软件下载
  4. 计算机科学与技术项目,计算机科学与技术在工程建设项目中的运用
  5. bat文件执行多条Linux命令,Js使用WScript.Shell对象执行.bat文件和cmd命令
  6. 设计模式:积分兑换系统的设计与实现
  7. 8年开发经验,帮你总结这帮双面HR们
  8. 从零实现 Cortex-M7从驱动到应用(一)分散加载+SDRAM+SPI_FLASH
  9. 交流电、交流信号、直流电、直流信号
  10. phpexcel 数字格式_phpexcel文本格式