精选优质文档-----倾情为你奉上杭 州 电 子 科 技 大 学实 验 报 告学生姓名:金雨鑫 学 号: 指导教师:吴端坡实验地点:第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’取值的多项式一一对应例如:代码对应的为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码4. 奇(ParityCheck)是一种校验代码传输正确性的方法根据被传输的一组的数位中“1”的个数是奇数或偶数来进行校验采用奇数的称为,反之,称为采用何种校验是事先规定好的通常专门设置一个,用它使这组代码中“1”的个数为奇数或偶数若用,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性五、实验目的:1.认识学习CRC原理,并掌握CRC16-IBM的编写方法2.学习奇偶校验的原理,并会用C代码编写六、实验内容:1. Cyclic redundancy checkUsing the polynomials below to encode random generated data stream (40-100bits). Show the FEC, and encoded data frame.CRC-4x4+x+1ITU G.704CRC-16x16+x15+x2+1IBM SDLCCRC-32x32+x26+x23+...+x2+x+1ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSFor the error patter listed below, what the conclusion does the receiver get? Can the receiver find the errors?CaseError patternNo error0000……0000One error1000…..000Two errors100….001Random errorsRandom error pattern2. 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?CaseError patternNo error0000……0000One error1000…..000Two errors100….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> 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>8; printf("%s ",hex_byte(c)); c=dat&0xff; printf("%s ",hex_byte(c));}unsigned char data[512]={a,b,c,d};unsigned char ALL_ZERO[512]={0};#define DATA_LEN 4#define DATA_TST dataint main(){ uint16_t crc16; 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]=crc16>>8; 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); return 0;}奇偶校验:#include#include#include#include#include #include #define NO_ERROR 1#define ONE_ERROR 2#define TWO_ERROR 3#define Parity 0#define check 1int 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; //messages 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",message); length = strlen(message); ByteToBit(message_output,message,length*8); for(k = 0;k