实 验 报 告
学生姓名:金雨鑫 学 号:12081220 指导教师:吴端坡 实验地点:第1教研楼108
实验时间:第10~12节
一、实验室名称: 计算机通信与网络实验室
二、实验项目名称:Coding on error dectecting algorithms(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. Cyclic redundancy check
Using the polynomials below to encode random generated data stream (40-100bits). Show the FEC, and encoded data frame.
CRC-4 x4+x+1 ITU G.704 CRC-16 x16+x15+x2+1 IBM SDLC
x32+x26+x23+...+x2+ZIP, RAR, IEEE 802 LAN/FDDI, IEEE
CRC-32
x+1 1394, PPP-FCS
For the error patter listed below, what the conclusion does the receiver get? Can the receiver find the errors? Case No error One error Two errors Random errors
Error pattern 0000……0000 1000…..000 100….001
Random error pattern
2. Parity check
Using even or odd parity check on random generated data stream (8-20bits). Show encoded data frame.
For the error patter listed below, what the conclusion does the receiver get? Can the receiver find the errors? Case No error One error Two errors
Error pattern 0000……0000 1000…..000 100….001
七、实验器材(设备、元器件):
笔记本1台,
八、实验步骤:#include #include using namespace std; #define POLY 0xA001 //8005的二进制倒过来写就是A001 不同的计算机存储数据的时候可能会不一样 类似于大端和小端 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; uint16_t gen_crc16 (uint8_t const * buffer, uint16_t len) { uint16_t i, j; uint8_t data; uint16_t crc=0; for (j = 0; j crc = ((data ^ (uint8_t) crc) & 1)? ((crc >> 1) ^ POLY): (crc >> 1); data >>= 1; } } return crc; } char* hex_byte(unsigned char c) { static unsigned char buf[9]={0}; char i; for(i=0;i<8;i++) { buf[i]=((c>>(7-i))&1)+'0'; } return (char*)buf; } void hex_print(unsigned char* c,int len) { int i; for(i=0;i printf(\"\\n\"); } void hex_print_ushort(unsigned int dat) { char c=dat>>8; printf(\"%s \ c=dat&0xff; printf(\"%s \ } unsigned char data[512]={'a','b','c','d'}; unsigned char ALL_ZERO[512]={0}; #define DATA_LEN 4 #define DATA_TST data int main() { uint16_t crc16; printf(\"原始数据:\\"); hex_print(DATA_TST,DATA_LEN); printf(\"CRC-16: \\"); crc16=gen_crc16(DATA_TST,DATA_LEN); hex_print_ushort(crc16); printf(\"(0x%x)\\n\ DATA_TST[DATA_LEN+1]=crc16>>8; DATA_TST[DATA_LEN]=crc16&0xff; printf(\"\\n要发送的数据:\\"); hex_print(DATA_TST,DATA_LEN+2); printf(\"\\n如果没有错误:\\n\"); printf(\"核对结果: \\"); crc16=gen_crc16(DATA_TST,DATA_LEN+2); hex_print_ushort(crc16); printf(\"\\n\\n如果第一位数据反转了 \\n\"); DATA_TST[0]=DATA_TST[0]^0x80; printf(\"错误数据: \\"); hex_print(DATA_TST,DATA_LEN+2); printf(\"校验后 \\"); crc16=gen_crc16(DATA_TST,DATA_LEN+2); hex_print_ushort(crc16); return 0; } 奇偶校验: #include #define NO_ERROR 1 #define ONE_ERROR 2 #define TWO_ERROR 3 #define Parity 0 #define check 1 int flag_parity;//判断奇偶校验 void ByteToBit(char* out,const char* in,int bits); char Parity_check(char *message_output,int length,int mode); int main() { int channel_way =0; int len_d=5,k,f,message_number;//被除数长度设置 int length; //message's length char message_input[1000]=\"\"; char message[8]={NULL};// data that produced by chance char message_output[1000] = {NULL}; fflush(stdin); //任意输入数据 printf(\"please input the message!\\n\"); gets(message); printf(\"A need to send this message:%s\\n\ length = strlen(message); ByteToBit(message_output,message,length*8); for(k = 0;k printf(\"Please select the parity mode\\n\"); printf(\" 1.Even parity \\n\"); printf(\" 2.Odd parity\\n\"); scanf(\"%d\ char m = 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\printf(\"\\n\"); printf(\"*************************************\\n\"); printf(\"****** analog channel ******\\n\"); printf(\"***please choice the way of error****\\n\"); printf(\"**** 1.No error *****\\n\"); printf(\"**** 2.One error *****\\n\"); printf(\"**** 3.Two errors *****\\n\"); scanf(\"%d\if(channel_way == NO_ERROR) { for(f =0;f 48; for(f =0;f ************************************************/ void ByteToBit(char* out,const char* in,int bits) { //char out_1[1000] = \"\"; int i; // printf(\"%s\\n\ for(i=0;i /*********************************************** /function: 完成奇偶校验 /输入:message_output为需要传输的数据以及数据的长度lengh 奇偶校验的模式 /输出:返回奇偶校验的结果 ************************************************/ char Parity_check(char *message_output,int length,int mode) { fflush(stdin); int i,j = 0; //偶校验 if(flag_parity== 1) { if(mode == Parity) { for(i = 0;i else if(flag_parity == 0) { if(mode == Parity) { for(i = 0;i } } else continue; } if(j%2 == 1) return '0'; else return '1'; 九、实验数据及结果分析: 与标准CRC校验计算器的对比 CRC:除了没有错误之外,其余的均能检测到错误。 奇偶校验: Even parity: No error: One error: Two error: Odd parity: No error: One error: Two error: 结果如图中所示:奇偶校验能够检测出信息传输过程中的部分误码(奇数位误码能检出,偶数位误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。 十、实验结论: CRC:除了没有错误之外,其余的均能检测到错误。 奇偶校验:结果如图中所示:奇偶校验能够检测出信息传输过程中的部分误码(奇数位误码能检出,偶数位误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。 十一、总结及心得体会: 通过这次实验,我认识了,CRC校验,奇偶校验的原理,并且编写代码,加深对实验的理解。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务