C语言累加和校验 CRC校验实验报告书.docx
- 文档编号:8753138
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:204.58KB
C语言累加和校验 CRC校验实验报告书.docx
《C语言累加和校验 CRC校验实验报告书.docx》由会员分享,可在线阅读,更多相关《C语言累加和校验 CRC校验实验报告书.docx(10页珍藏版)》请在冰豆网上搜索。
C语言累加和校验CRC校验实验报告书
实验报告书
实验名称:
累加和校验、CRC校验
系(部):
专业班级:
学生姓名:
学号:
指导教师:
完成日期:
一、实验目的
1.熟悉累加和校验及CRC校验的原理。
2.掌握累加和校验及CRC校验简单的使用方法及作用。
3.复习巩固数据指针的使用方法及其原理。
4.温习子函数的调用方法,掌握子函数的工作原理包括:
怎样返回某个数据、怎样进行调用等。
5.练习在linux环境下使用vim编译器编译运行程序,以便提高程序的运行效率且便于操作。
二、实验内容及要求
2.1内容及要求
内容:
使用c语言,设计一个实验——累加和校验、CRC校验。
要求:
1.该校验程序总体需要实现两大部分功能:
累加和校验和CRC校验;
2.通过键盘控制输入一组数据,分别进行累加和校验、CRC校验;
3.最终生成校验位,将数据转换成16进制和校验位一起输出。
2.2实验环境
操作系统:
Linux操作系统、window10操作系统;
C语言环境:
vim编辑器、DEVC++编辑器。
硬件环境:
机房内电脑及个人笔记本电脑。
三、实验相关知识
3.1累加和校验原理
累加和校验实现方式有很多种,最常用的一种是在一次通讯数据包的最后加入一个字节的校验数据。
这个字节内容为前面数据包中全部数据的忽略进位的按字节累加和。
比如下面的例子:
我们要传输的信息为:
6、23、4
加上校验和后的数据包:
6、23、4、33
这里33为前三个字节的校验和。
接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。
累加和校验由于实现起来非常简单,也被广泛的采用。
但是这种校验方式的检错能力比较一般,对于单字节的校验和大概有1/256的概率将原本是错误的通讯数据误判为正确数据。
3.2CRC校验原理
CRC校验在传输数据的形式上与累加和校验是相同的,都可以表示为:
通讯数据校验字节(也可能是多个字节)。
其算法的基本思想是将传输的数据当做一个位数很长的数。
将这个数除以另一个数。
得到的余数作为校验数据附加到原数据后面。
该基本算法步骤如下所示:
1、将X的最高次幂为R的多项式G(X)转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式C(X)*2R。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
四、实验设计思路
4.1实验思路
为了满足实验要求,此处利用指针结合两种校验方式的工作原理来设计整个程序模块。
具体思路如下:
1)定义变量及函数初始化
定义一个数据指针ptr,方便在CRC校验过程中对数据进行处理;定义数组a[N]用于存放累加和校验及CRC校验产生的每一位数据;此外还定义了其他变量如:
len为数据长度变量、sum累加和等。
2)输入部分
(1)允许手动输入需要校验的数据个数;
(2)当手动输入所需要的数据个数后,程序会提示您输入数据,此时允许输入一定数量的数据,以回车符或者空格的形式间隔开输入的每个数据。
3)计算部分
累加和校验:
利用3.1中累加和校验的原理,通过对数据求和、取余等操作计算出校验位。
CRC校验:
利用3.1中CRC校验的原理,结合for循环语句和位运算计算出CRC校验位。
4)输出部分
当累加和校验和CRC校验对输入数据完成校验后,借助for循环语句,通过定义printf的格式修饰符为%x使输出的数据为16进制,依次输出相应数据的校验码。
4.2实验思路流程图
根据思路分析及实验要求,设计程序思路流程图如下:
五、具体步骤
5.1定义指针及相关变量
定义变量Z用于控制输入数据的个数;定义变量x代表手动输入的数据;定义变量sum用于存放累加和;定义数组a[100]用于存放累加和校验及CRC校验产生的每一位数据;除此之外还定义了一些其他变量,具体变量如下:
5.2输入部分
允许手动输入所需要的相关信息:
所需要的数据的个数及具体的数据。
5.3计算部分
5.3.1累加和校验
利用for循环语句,保证循环之前数据和sum=0的前提下,循环z次,每次循环都对输入的数据进行求和运算,即sum+=x;,每次求和后都需要执行选择语句if(sum>255)来判断数据和是否大于255,若大于255,则使用语句sum=sum%255;对数据和进行取余运算,直到满足条件循环结束,最终得到累加和校验位。
5.3.2CRC校验
在设计CRC校验程序模块时,为了程序的可读性,此处利用子函数调用的方式进行设计。
利用while循环语句,共循环len次(按照数据的个数进行循环),使用语句while(len--)依次遍历输入数据的高低位;在while语句内部使用for循环语句for(i=0x80;i!
=0;i>>=1),在for循环内,首先保证crc&0x8000)!
=0的前提下通过crc<<=1对数据进行位移操作;利用指针ptr的自加运算实现对该数组中不同的数据进行校验。
在主函数中使用语句crc(a,z)与子函数unsignedintcrc(unsignedchar*ptr,unsignedcharlen)建立连接,通过子程序对数组a[]进行CRC校验,并通过return(crc)返回校验码。
5.4输出部分
利用for循环依次输出产生的累加和校验码和CRC校验码。
5.5实验总程序
#include
#defineN100
unsignedchara[N];
unsignedcharlen;
unsignedintcrc(unsignedchar*ptr,unsignedcharlen)
{
unsignedchari;
unsignedintcrc=0;
while(len--)
{
for(i=0x80;i!
=0;i>>=1)
{
if((crc&0x8000)!
=0)
{
crc<<=1;
crc^=0x1021;
}
elsecrc<<=1;
if((*ptr&i)!
=0)
crc^=0x1021;
}
ptr++;
}
return(crc);
}
intmain()
{
intz,x,i,sum=0,c;
printf("请输入数据个数:
\n");
scanf("%d",&z);
printf("请输入数据:
\n");
for(i=0;i { scanf("%d",&x); a[i]=x; sum+=x; if(sum>255) { sum=sum%255; } } printf("累加和校验: \n"); for(i=0;i printf("%#x",a[i]); printf("%#x\n\n",sum); printf("CRC校验: \n"); for(i=0;i printf("%#x",a[i]); printf("0x%04x",crc(a,z)&0xFFFF); } 5.6实验总流程图 六、实验结果 编译运行程序,首先交互界面会提示输入需要的数据个数,其次提示输入具体的数据,输入完成便可得到对应数据的校验码。 具体运行结果如下: 七、实验总结 本次实验设计完成,主要实现了两种校验: 累加和校验和CRC校验。 对于累加和校验其主要解题思想是: 整体上利用for循环,将数据进行累加和计算,通过特定条件的判定进行取模运算,循环结束即可得到校验码。 对于CRC校验,主要利用位运算的方法,结合数据的移位、指针变量的自加等操作实现。 程序框架编写完成,经过多次的编译调试,最终程序运行结果较为理想,实现了本次实验要求。 本次实验过程波折不断。 拿到实验题目之后,一直查找相应的资料,但是课上的两节课近乎毫无收获,头脑比较混乱,课下又找了同学讨论了此次实验的解题思路,综合自己所查找到的关于两种校验方法的资料,最终才完成了实验。 正是波折的设计程序过程,让我更好的理解掌握了累加和校验及CRC校验的原理及运用方法,同时也解了校验字段的组成,及信息传输双方是如何进行交流的等知识。 此次实验使我认识到了自己在C语言编程方面能力的欠缺,在之后的学习中,我会查缺补漏,多练习C语言,加强C语言的学习,使自己在编程方面有所提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言 累加和校验 CRC校验实验报告书 语言 累加 校验 CRC 实验 报告书