杭州电子科技大学实验报告学生姓名:金雨鑫学号:12081220指导教师:吴端坡实验地点:第1教研楼108实验时间:第10~12节一、实验室名称:计算机通信与网络实验室二、实验项目名称:Codingonerrordectectingalgorithms(C++)三、实验学时:3学时四、实验原理:1.CRC即循环冗余校验码(CyclicRedundancyCheck[1]):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。2.循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*xR),这样C(x)的右边就会空出R位,这就是校验码的位置。用C(x)*xR除以生成多项式G(x)得到的余数就是校验码。3.任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。4.奇偶校验(ParityCheck)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。五、实验目的:1.认识学习CRC原理,并掌握CRC16-IBM的编写方法。2.学习奇偶校验的原理,并会用C代码编写。六、实验内容:1.CyclicredundancycheckUsingthepolynomialsbelowtoencoderandomgenerateddatastream(40-100bits).ShowtheFEC,andencodeddataframe.CRC-4x4+x+1ITUG.704CRC-16x16+x15+x2+1IBMSDLCCRC-32x32+x26+x23+...+x2+x+1ZIP,RAR,IEEE802LAN/FDDI,IEEE1394,PPP-FCSFortheerrorpatterlistedbelow,whattheconclusiondoesthereceiverget?Canthereceiverfindtheerrors?CaseErrorpatternNoerror0000……0000Oneerror1000…..000Twoerrors100….001RandomerrorsRandomerrorpattern2.ParitycheckUsingevenoroddparitycheckonrandomgenerateddatastream(8-20bits).Showencodeddataframe.Fortheerrorpatterlistedbelow,whattheconclusiondoesthereceiverget?Canthereceiverfindtheerrors?CaseErrorpatternNoerror0000……0000Oneerror1000…..000Twoerrors100….001七、实验器材(设备、元器件):笔记本1台,八、实验步骤:#includeiostream#includestdio.husingnamespacestd;#definePOLY0xA001//8005的二进制倒过来写就是A001不同的计算机存储数据的时候可能会不一样类似于大端和小端typedefunsignedcharuint8_t;typedefunsignedshortuint16_t;typedefunsignedintuint32_t;uint16_tgen_crc16(uint8_tconst*buffer,uint16_tlen){uint16_ti,j;uint8_tdata;uint16_tcrc=0;for(j=0;jlen;j++){data=buffer[j];for(i=0;i8;i++){crc=((data^(uint8_t)crc)&1)?((crc1)^POLY):(crc1);data=1;}}returncrc;}char*hex_byte(unsignedcharc){staticunsignedcharbuf[9]={0};chari;for(i=0;i8;i++){buf[i]=((c(7-i))&1)+'0';}return(char*)buf;}voidhex_print(unsignedchar*c,intlen){inti;for(i=0;ilen;i++){printf(%s,hex_byte(c[i]));}printf(\n);}voidhex_print_ushort(unsignedintdat){charc=dat8;printf(%s,hex_byte(c));c=dat&0xff;printf(%s,hex_byte(c));}unsignedchardata[512]={'a','b','c','d'};unsignedcharALL_ZERO[512]={0};#defineDATA_LEN4#defineDATA_TSTdataintmain(){uint16_tcrc16;printf(原始数据:\t);hex_print(DATA_TST,DATA_LEN);printf(CRC-16:\t);crc16=gen_crc16(DATA_TST,DATA_LEN);hex_print_ushort(crc16);printf((0x%x)\n,crc16);DATA_TST[DATA_LEN+1]=crc168;DATA_TST[DATA_LEN]=crc16&0xff;printf(\n要发送的数据:\t);hex_print(DATA_TST,DATA_LEN+2);printf(\n如果没有错误:\n);printf(核对结果:\t);crc16=gen_crc16(DATA_TST,DATA_LEN+2);hex_print_ushort(crc16);printf(\n\n如果第一位数据反转了\n);DATA_TST[0]=DATA_TST[0]^0x80;printf(错误数据:\t);hex_print(DATA_TST,DATA_LEN+2);printf(校验后\t);crc16=gen_crc16(DATA_TST,DATA_LEN+2);hex_print_ushort(crc16);return0;}奇偶校验:#includestdio.h#includestdlib.h#includememory.h#includestring.h#includeconio.h#includetime.h#defineNO_ERROR1#defineONE_ERROR2#defineTWO_ERROR3#defineParity0#definecheck1intflag_parity;//判断奇偶校验voidByteToBit(char*out,constchar*in,intbits);charParity_check(char*message_output,intlength,intmode);intmain(){intchannel_way=0;intlen_d=5,k,f,message_number;//被除数长度设置intlength;//message'slengthcharmessage_input[1000]=;charmessage[8]={NULL};//datathatproducedbychancecharmessage_output[1000]={NULL};fflush(stdin);//任意输入数据printf(pleaseinputthemessage!\n);gets(message);printf(Aneedtosendthismessage:%s\n,message);length=strlen(message);ByteToBit(message_output,message,length*8);for(k=0;klength*8;k++){printf(%d,message_output[k]);message_input[k]=message_output[k]+48;}printf(Pleaseselecttheparitymode\n);printf(1.Evenparity\n);printf(2.Oddparity\n);scanf(%d,&flag_parity);charm=Parity_check(message_input,length*8,Parity);printf(在信道中传输的message:);message_input[length*8]=m;for(message_number=0;message_number=length*8;message_number++)printf(%c,message_input[message_number]);printf(\n);printf(*************************************\n);printf(******analogchannel******\n);printf(***pleasechoicethewayoferror****\n);printf(****1.Noerror*****\n);printf(****2.Oneerror*****\n);printf(****3.Twoerrors*****\n);scanf(%d,&channel_way);if(channel_way==NO_ERROR){for(f=0;flength*8;f++)printf(%c,message_input[f]);printf(正在检错中.......\n);printf(检错结果:);charflag_parity_mode=Parity_check(message_input,length*8,check);if(flag_parity_mode==(message_input[length*8]))printf(noerror!\n);}if(channel_way==ONE_ERROR){message_input[0]=((message_input[0]-48)^('1'-48))+48;for(f=0;flength*8;f++)printf(%c,message_input[f]);printf(正在检错中.......\n);printf(检错结果:);charflag_parity_mode=Parity_check(message_input,length*8,check);if(flag_parity_mode!=(message_input[length*8]))printf(error!\n);}if(channel_way==TWO_ERROR){message_input[0]=((message_input[0]-48)^('1'-48