计算机网络课程设计-帧封装
计算机网络-帧封装C

/*将fileinput文件中的数据封装成帧,封装好的帧写入到文件中.如果数据长度小于46字节,则补全到46字节,如果数据长度大于1500,则封装成多个帧*/ #include <stdio.h>#include <stdlib.h>#define MAXSIZE 1500/*帧封装函数,完成把给定的文件封装成帧的功能*/int zhenfengzhuang(char *fileinput){int i,lastDataPacket,pyl; //记录最后一个帧,记录偏移量FILE *fileIn,*fileOut;long startjyw,endjwy; //开始检验位置,结束检验位置short dataNum; //记录校验字节个数if((fileIn = fopen(fileinput,"r+")) == NULL){printf("%s","打开文件失败");return 1;}if((fileOut = fopen("E:\\out.txt","w+")) == NULL){printf("%s","写入文件失败");return 1;}printf("\n封装后的文件保存地址:E:\\out.txt");/**先把fpIn指针退回到文件结尾处。
再得到文件位置指针当前位置相对于文件首的偏移字节数,即可得到内容的长度*/ fseek(fileIn,0,SEEK_END);pyl = ftell(fileIn);//计算整1500数据包个数int dataPacketNum = pyl/1500;//把文件指针重新回到文件开头。
rewind(fileIn);/*for循环处理大于1500B的情况,当大于1500时自动转换到下一个数据帧中*/for(int j = 0;j <= dataPacketNum; j++){char data[MAXSIZE]; //数据临时存储数组//写入帧前导码,十六进制0xaaprintf("\n帧的前导码:");for(i = 0;i < 7; i++){fputc(0xaa,fileOut);printf("%X ",0xaa);//写入帧定界符fputc(0xab,fileOut);printf("%X ",0xab);unsigned char mudiMac[6] = {0x4a,0x7b,0x3c,0x5d,0xe6,0x8f};//模拟目的MAC 地址unsigned char yuanMac[6] = {0x34,0xe6,0xf7,0xb4,0xa6,0x52};//模拟源MAC地址//记录开始进行校验的位置,因为校验是从前导码以后开始的startjyw = ftell(fileOut);printf("\n帧的目的MAC地址:");for(i = 0; i < 6; i++){fputc(mudiMac[i],fileOut);//写入目的MACprintf("%X ",mudiMac[i]);}printf("\n帧的源MAC地址:");for(i = 0; i < 6; i++){fputc(yuanMac[i],fileOut); //写入源MACprintf("%X ",yuanMac[i]);//不是最后一个数据,则前面的数据都应该是1500,所以按最大数据数算if(j != dataPacketNum){//添加长度字段fputc(char(1500/256),fileOut);fputc(char(1500%256),fileOut);fread(data,sizeof(char),1500,fileIn);fwrite(data,sizeof(char),1500,fileOut);//记录开插入校验码的位置endjwy = ftell(fileOut);fputc(0x00,fileOut); //添加辅助检验字段dataNum = short(ftell(fileOut)) - (short)startjyw; //计算检验的字段长度}else{//得到最后一个数据块的位置lastDataPacket = ftell(fileIn);//剩下有多少字节int hasLongs = pyl - dataPacketNum * 1500;//还有多少不够46Bint surplusLongs = 46 - hasLongs;//记录长度字段fputc(char(hasLongs/256),fileOut);fputc(char(hasLongs%256),fileOut);//先读取剩余的所有数据fread(data,sizeof(char),pyl - lastDataPacket,fileIn);//如果不足,则填充if(surplusLongs > 0){for(i = 0;i < surplusLongs; i++){//把不够的部分模拟补上data[hasLongs++] = 0x00;}fwrite(data,sizeof(char),46,fileOut); //写入数据endjwy = ftell(fileOut); //记录开插入校验码的位置//添加辅助检验字段fputc(0x00,fileOut);dataNum = short(ftell(fileOut)) - (short)startjyw; //计算检验的字段长度}else{//多于或者等于46B,则正常读取fwrite(data,sizeof(char),pyl - lastDataPacket,fileOut);//记录开插入校验码的位置endjwy = ftell(fileOut);fputc(0x00,fileOut);dataNum = short(ftell(fileOut)) - (short)startjyw;}}fseek(fileOut,(short)startjyw,SEEK_SET); //将读指针指向开始校验的位置unsigned char crc = 0;int statusNum = dataNum;while(statusNum--){char temp;//读1B的数据temp = fgetc(fileOut);//模拟数据除的二进制除法过程for(unsigned char i = (unsigned char)0x80; i > 0;i >>= 1){if(crc & 0x80){ //当前余数最高位为1,需要进行除法运算。
ETHERNET的帧封装课程设计

ETHERNET的帧封装课程设计一、课程目标知识目标:1. 理解ETHERNET帧封装的基本概念和原理;2. 掌握ETHERNET帧的结构,包括前导码、目的地址、源地址、类型/长度、数据和循环冗余校验(CRC);3. 了解不同类型以太网帧的封装过程及其差异。
技能目标:1. 能够独立完成ETHERNET帧的构建和解析;2. 学会使用相应工具或软件对ETHERNET帧进行抓包和分析;3. 培养学生对网络通信过程中帧封装的实际应用能力。
情感态度价值观目标:1. 培养学生对计算机网络知识的好奇心和探索精神;2. 增强学生合作学习、讨论交流的能力,提高团队意识;3. 通过学习计算机网络知识,让学生认识到科技发展对社会进步的重要性。
课程性质:本课程为计算机网络技术基础课程,以理论教学和实践操作相结合的方式进行。
学生特点:学生已具备一定的计算机网络基础知识,对ETHERNET有一定了解,但对帧封装的具体过程尚不熟悉。
教学要求:结合学生特点和课程性质,以实际操作为主,理论讲解为辅,注重培养学生的实践能力和团队协作能力。
通过本课程的学习,使学生能够掌握ETHERNET帧封装的相关知识,为后续计算机网络课程打下坚实基础。
二、教学内容1. 引言:回顾计算机网络基础知识,引导学生认识ETHERNET帧封装的重要性。
- 网络体系结构概述- 以太网发展简史- 帧封装的作用与意义2. ETHERNET帧结构解析:- 帧结构组成:前导码、目的地址、源地址、类型/长度、数据、CRC- 各字段作用及取值范围- 不同类型以太网帧结构对比3. 帧封装过程:- 数据链路层与物理层关系- 帧封装流程及关键技术- 帧封装错误处理机制4. 实践操作:- 使用Wireshark等抓包工具抓取和分析ETHERNET帧- 搭建实验环境,模拟帧封装过程- 分析实验结果,总结帧封装规律5. 教学案例分析:- 分析实际网络环境中的帧封装案例- 探讨案例中存在的问题及解决方案教学内容安排与进度:1. 引言与ETHERNET帧结构解析(1课时)2. 帧封装过程与实践操作(2课时)3. 教学案例分析(1课时)本教学内容以课本相应章节为基础,注重理论与实践相结合,旨在帮助学生系统地掌握ETHERNET帧封装的相关知识。
计算机网络帧的封装实验报告

一、实验目的1.了解协议分析器安装;2.了解协议分析器使用方法和基本特点;3.分析以太网层的数据帧格式(包括源地址、目的地址和上层协议)。
二、实验前的准备1.了解协议分析器的功能和工作原理;2.了解Ethereal分析器的使用方法;3.阅读实验的相关阅读文献。
三、实验内容1.Ethereal协议分析器并安装。
记录安装过程。
安装wireshark截图如下:2.分析以太网层的数据帧格式(包括源地址、目的地址和上层协议),下图是打开的已经捕获的文件界面,选中第4个组,再选中Ethernet 层即以太网层。
观察帧信息。
以太网层的数据帧格式:前导码:由7字节的前同步码和1字节的帧起始定界符构成起始定界符:这个字段用1字节(10101011)作为帧开始的信号,表示一帧的开始。
最后两位是11,表示下面的字段是目的地址。
目的地址(DA):共48位,表示帧准备发往目的站的地址,共6个字节,可以是单址(代表单个站)、多址(代表一组站)或全地址(代表局域网上的所有站)。
当目的地址出现多址时,表示该帧被一组站同时接收,称为“组播”(Multicast)。
目的地址出现全地址时,表示该帧被局域网上所有站同时接收,称为“广播”(Broadcast),通常以DA的最高位来判断地址的类型,若第一字节最低位为“0”则表示单址,第一字节最低位为“1”则表示组播。
源地址(SA):共48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址。
类型:该字段用于标识数据字段中包含的高层协议,也就是说,该字段告诉接收设备如何解释数据字段。
例如:0X0800代表为IP,0X0806代表为ARP。
数据:数据字段的最小长度必须为46字节以保证帧长至少为64字节,这意味着传输一字节信息也必须使用46字节的数据字段:如果填入该字段的信息少于46字节,该字段的其余部分也必须进行填充。
数据字段的默认最大长度为1500字节。
帧检验序列(FCS):FCS是32位冗余检验码(CRC),检验除前导、SFD和FCS以外的内容。
帧封装、IP数据包解析和发送TCP数据包

计算机网络课程设计报告院(系):计算机学院专业:计算机科学与技术姓名:班级:学号:指导教师:2009 年7 月4 日计算机网络课程设计之协议编程实验一帧封装实验目的:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
•输出:对应input1和input2得结果分别为output1和output2。
试验要求:•编写程序,根据给出的原始数据,组装一个IEEE 802.3格式的帧(题目)默认的输入文件为二进制原始数据(文件名分别为input1和input2))。
•要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile,其中,inputfile为原始数据文件,outputfile为输出结果。
输出:对应input1和input2得结果分别为output1和output2验设计相关知识:帧:来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程度上可以被看作是机器之间的数据链路层连接。
按802.3标准的帧结构如下表所示(802.3标准的Ethernet帧结构由7部分组成)802.3标准的帧结构其中,帧数据字段的最小长度为46B 。
如果帧的LLC 数据少于46B ,则应将数据字段填充至46B 。
填充字符是任意的,不计入长度字段值中。
在校验字段中,使用的是CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。
计算机网络课程设计报告 帧封装

课程设计报告课程名称:计算机网络课程设计设计题目:帧封装姓名:专业:计算机科学与技术班级:计算机13-3班学号:计算机科学与技术学院2016年1 月1 日设计项目:帧封装一、选题背景以太网这个术语通常是指由DEC、Intel和Xerox公司在1982年联合公布的一个标准,它是当今TCP/IP采用的主要的局域网技术,它采用一种称作CSMA/CD的媒体接入方法。
在TCP/IP世界中,以太网IP数据报文的封装在RFC894中定义。
以太网采用广播机制,所有与网络连接的工作站都可以看到网络上传递的数据。
通过查看包含在帧中的目标地址,确定是否进行接收或放弃。
如果证明数据确实是发给自己的,工作站将会接收数据并传递给高层协议进行处理。
以太网采用CSMA/CD(Carrier Sense Multiple Access/Collision Detection)媒体访问机制,任何工作站都可以在任何时间访问网络。
在以太网中,所有的节点共享传输介质。
如何保证传输介质有序、高效地为许多节点提供传输服务,就是以太网的介质访问控制协议要解决的问题。
帧是在数据链路层数据进行传输与交换的基本单位。
构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。
本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。
二.设计思路数据在网络上是以很小的称为帧(Frame)的单位传输的,帧由几部分组成,不同的部分执行不同的功能。
帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上,通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。
接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧已到达,然后对其进行存储。
“帧”数据大致由两部分组成:帧头和帧数据。
帧头包括接收方主机物理地址的定位以及其它网络信息。
计算机网络帧封装课程设计报告

对于帧的封装:首先填充帧头部字段。其次便是填充帧的数据的字段 (注意数据字段的长度)。最后便是 CRC 校验了。对于 CRC 校验,我们需要将校 验结果记入帧校验字段。(其实现过程详细见课程设计过程)
1.帧............................................................................................................................................. 1 2.CRC 校验.................................................................................................................................. 2 三、 课程设计过程........................................................................................................................... 3 1.填充帧头部字段..................................................................................................................... 3 2.填充数据字段......................................................................................................................... 4 3.CRC 校验.................................................................................................................................. 4 4. 相关扩展............................................................................................................................... 5
计算机网络课程设计:(第三章)封装Ethernet帧(完整程序代码)

计算机网络课程设计第二章:封装Ethernet帧完整程序:#include<iostream.h>#include<fstream.h>void main(int argc,char* argv[]){if(argc!=3){cout<<"Please input commmand: EncapFrame input_fileoutput_file"<<endl;return;}fstream file;file.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc);for(int i=0;i<7;i++)file.put(char(0xaa));file.put(char(0xab));long pCrcS=file.tellp();chardst_addr[6]={char(0x00),char(0x00),char(0xe4),char(0x86),char(0x3a),char(0xdc)}; file.write(dst_addr,sizeof(dst_addr));charsrc_addr[6]={char(0x00),char(0x00),char(0x80),char(0x1a),char(0xe6),char(0x65)}; file.write(src_addr,sizeof(src_addr));ifstream infile;infile.open(argv[1],ios::binary);infile.seekg(0,ios::end);short length=(short)infile.tellg();file.put(char(length/256));file.put(char(length%256));char* data=new char[length];infile.seekg(0,ios::beg);infile.read(data,length);file.write(data,length);infile.close();delete data;if(length<46)for(int i=0;i<46-length;i++)file.put(char(0x00));long pCrc=file.tellp();file.put(char(0x00));short total=short(file.tellp())-(short)pCrcS;file.seekg(pCrcS,ios::beg);unsigned char crc=0;while(total--){unsigned char temp;file.get(temp);for(unsigned char i=(unsigned char)0x80;i>0;i>>=1){if(crc&0x80){crc<<=1;if(temp&i)crc^=0x01;crc^=0x07;}else{crc<<=1;if(temp&i)crc^=0x01;}}}file.seekp(pCrc,ios::beg);file.put(crc);file.seekg(0,ios::beg);cout<<"Content of ethernet frame: "<<endl;while(!file.eof()){unsigned char temp;file.get(temp);cout<<hex<<(short)temp<<" ";}cout<<endl<<"The"<<argv[2]<<" is completed";file.close();}结果:。
计算机网络课设__封装Ethernet帧

成绩评定表课程设计任务书摘要本设计题目是封装Ethernet帧,要实现的功能是通过封装Ethernet 帧,了解Ethernet帧中各个字段的含义与用途。
首先介绍本题目的相关知识,有帧的结构及和CRC冗余校验算法。
其次是程序设计分析,主要包括填充帧头部字段、填充数据字段和CRC 校验,并根据算法给出了程序流程图。
最后,是程序运行结果及实现代码,运行结果符合设计要求。
本程序主要关键词有:帧,CRC冗余校验,封装,填充等。
目录1.课程设计目的. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 2.课程设计要求. . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 3.相关知识. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 4.课程设计分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8 5.相关扩展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10 6.程序代码. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14 7.运行结果与分析. . . . . . . . . . . . . . . . . . . . . . . . . . . .16 8.参考文献. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .171课程设计目的帧是在数据链路层中进行数据传输的基本单位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1概述 (2)1.1设计目的 (2)1.2设计要求 (2)1.3设计原理 (2)2详细设计 (3)2.1设计思路 (3)2.2程序流程图 (5)3程序代码 (8)4运行结果 (10)5总结与体会 (11)6参考资料 (12)1概述1.1设计目的帧是在数据链路层数据进行传输与交换的基本单位。
构造帧对于理解网络协议的概念、协议执行过程以及网络问题处理的一般方法具有重要的意义。
本次课程设计的目的是应用数据链路层与介质访问控制层的知识,根据数据链路层的基本原理,通过构造一个具体的Ethernet帧,从而深入理解网络协议的基本概念与网络问题处理的一般方法。
1.2设计要求编写程序,根据给出的原始数据,组装一个IEEE802.3格式的帧(题目默认的输入文件为二进制原始数据(文件名为input1和input2))。
1)要求程序为命令行程序。
比如,可执行文件名为framer.exe,则命令行形式如下:framer inputfile outputfile其中,inputfile为原始数据文件,outputfile为输出结果。
使用操作系统、语言、编程环境不限,但在报告中必须注明。
2)输出:对应input1和input2的结果分别为output1和output2。
1.3设计原理帧:来源于串行线路上的通信。
其中,发送者在发送数据的前后各添加特殊的字符,使它们成为一个帧。
Ethernet从某种程度上可以被看作是机器之间的数据链路层连接。
按802.3标准的帧结构如下表所示(802.3标准的Ethernet帧结构由7部分组成)其中,帧数据字段的最小长度为46B 。
如果帧的LLC 数据少于46B ,则应将数据字段填充至46B 。
填充字符是任意的,不计入长度字段值中。
在校验字段中,使用的是CRC 校验。
校验的范围包括目的地址字段、源地址字段、长度字段、LLC 数据字段。
循环冗余编码(CRC)是一种重要的线性分组码、编码和解码方法,具有简单、检错和纠错能力强等特点,在通信领域广泛地用于实现差错控制。
CRC 校验码的检错能力很强,不仅能检查出离散错误,还能检查出突发错误。
利用CRC 进行检错的过程可简单描述如下:在发送端根据要传送的k 位二进制码序列,以一定的规则产生一个校验用的r 位监督码(CRC 码),附在原始信息的后边,构成一个新的二进制码序列(共k+r 位),然后发送出去。
在接收端,根据信息码和CRC 码之间所遵循的规则进行检验,以确定传送中是否出错。
这个规则在差错控制理论中称为“生成多项式”。
循环冗余校验码的特点:(1)CRC 校验码可检测出所有单个错误。
(2)CRC 校验码可检测出所有奇数位错误。
(3)CRC 校验码可检测出所有双位的错误(4)CRC 校验码可检测出所有小于、等于校验位长度的突发错误。
(5)CRC 校验码可以](1/2)-[11-k 的概率检测出长度为(K+1)位的突发错误2详细设计2.1设计思路程序共分三个部分:填充帧头部字段,填充数据字段,计算CRC 校验码并填充。
1. 填充帧头部字段在这一部分需要向输出文件写入前导码、帧前定界符、目的地址、源地址和长度字段。
写入前四个部分十分简单,而写入长度字段时需要计算输入文件的长度。
所以计算输入文件长度的方法如下所示:int length=0;infile.seekg(0,ios::end);//将读指针移到文件末尾。
length=infile.tellg();//计算指针偏移量,即为输入文件的长度。
unsigned char* data=new unsigned char[length];//创建字符指针并根据文件长度初始化。
infile.seekg(0,ios::beg);//将读指针移到文件开始。
infile.read(data,length);//将文件数据读入到字符指针data中。
file.put(char(length>>8));file.put(char(length&0xff));//将文件长度值按照逆序写入到输出文件的长度字段中。
file.write(data,length);//将data内容写入到输出文件中。
这种方法采用的是使用文件流相关函数的办法,简单明了,可以先获得文件数据长度,再申请相同大小的空间,不会造成空间上的浪费。
2. 填充数据字段在数据字段中,数据字段的最小长度为46B。
如果帧的LLC数据少于46B,则应将数据字段填充至46B。
填充字符是任意的,不计入长度字段值中。
在程序中是用一下方法实现的://如果输入文件长度不足46B,则用补足46Bif(length<46){for(int j=length;j<46;j++)file.put(char(0x00));}3.计算CRC校验码并填充帧封装的最后一步就是对数据进行校验,并将校验结果记入帧校验字段。
本程序中实现的是CRC-8校验算法,方法如下所示:file.put(char(0x00));//将数据字段后添加个file.seekg(8,ios::beg);//将读指针指向目的地址字段,从此处开始CRC计算 unsigned char ch;//ch用来保存读入的字符。
unsigned char crc=char(0x00);//余数初始值为。
while(1)//进行CRC计算{file.get(ch);if(ch==0xff)//判断是否到了文件结尾,如果是,则退出循环。
break;for(i=0;i<8;i++)//对入读入的字符的位分别处理。
{if(0x80==(crc&(0x80)))//当前余数最高位为,需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应的值递补到余数末位。
crc=crc^(0x07);//进行除法运算,即与除数的低位相异或。
}else//当前余数的最高位为,不需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应位的值递补到余数末位。
}ch=ch<<1;//读到的字符左移位,使数据下一位作为输入位。
}}2.2程序流程图图2.1帧封装程序流程图图2.2CRC计算流程图3程序代码#include<iostream.h>#include<fstream.h>#include<stdlib.h>void main(int argc,char*argv[]){//如果输入命令行不正确,则输出提示后退出。
if(argc!=3){cout<<endl<<"请按以下格式输入:framer inputfile outputfile"<<endl; exit(0);}//打开指定的输出文件,以二进制方式打开并可读可写,如文件存在,则清除其内容。
fstream file(argv[2],ios::out|ios::in|ios::binary|ios::trunc,0);for(int i=0;i<7;i++)file.put((char)0xaa);file.put((char)0xab);//写入B的前导码和B的帧前定界符。
chardes_add[]={char(0x00),char(0x00),char(0xE4),char(0x86),char(0x3A),cha r(0xDC)};file.write(des_add,6);//写入B的目的地址。
charsor_add[]={char(0x00),char(0x00),char(0x80),char(0x1A),char(0xE6),cha r(0x65)};file.write(sor_add,6);//写入B的源地址。
//创建输入文件流并打开指定的输入文件,以二进制方式打开并可读。
ifstream infile(argv[1],ios::in|ios::binary,0);int length=0;infile.seekg(0,ios::end);//将读指针移到文件末尾。
length=infile.tellg();//计算指针偏移量,即为输入文件的长度。
unsigned char* data=new unsigned char[length];//创建字符指针并根据文件长度初始化。
infile.seekg(0,ios::beg);//将读指针移到文件开始。
infile.read(data,length);//将文件数据读入到字符指针data中。
file.put(char(length>>8));file.put(char(length&0xff));//将文件长度值按照逆序写入到输出文件的长度字段中。
file.write(data,length);//将data内容写入到输出文件中。
//如果输入文件长度不足B,则用补足B。
if(length<46){for(int j=length;j<46;j++)file.put(char(0x00));}file.put(char(0x00));//将数据字段后添加个file.seekg(8,ios::beg);//将读指针指向目的地址字段,从此处开始CRC计算 unsigned char ch;//ch用来保存读入的字符。
unsigned char crc=char(0x00);//余数初始值为。
while(1)//进行CRC计算{file.get(ch);if(ch==0xff)//判断是否到了文件结尾,如果是,则退出循环。
break;for(i=0;i<8;i++)//对入读入的字符的位分别处理。
{if(0x80==(crc&(0x80)))//当前余数最高位为,需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应的值递补到余数末位。
crc=crc^(0x07);//进行除法运算,即与除数的低位相异或。
}else//当前余数的最高位为,不需要进行除法运算。
{crc=(crc<<1)&(0xff);//crc左移位,最低位补。
crc=crc|((ch&0x80)>>7);//将输入数据相应位的值递补到余数末位。