⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crc.cpp

📁 该程序是用C语言编写的
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <time.h>
#include <stdlib.h>

    //unsigned p24[]={1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1};  //X24+X23+X6+X5+X+1
    //unsigned p16[]={1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1}; //X16+X12+X5+1
    //unsigned p12[]={1,1,0,0,0,0,0,0,0,1,1,1,1}; //X12+X11+X3+X2+X+1
    //unsigned p8[]={1,1,0,0,1,1,0,1,1}; //X8+X7+X4+X3+x+1

    //unsigned length_crcpoly;  //校验比特长度加1
//CRC编码函数
void crcencode(unsigned array[],unsigned p[],unsigned size_info,unsigned size_crcpoly,unsigned crccode_output[])
{
	unsigned i=0,j=0;
    unsigned *s;
	unsigned *temp;

    s=new unsigned[size_crcpoly];
	temp=new unsigned[size_info+size_crcpoly];

	for(i=0;i<size_info;i++)
		temp[i]=array[i];


	for(i=size_info;i<size_info+size_crcpoly-1;i++)
        temp[i]=0;
		
    //crc 
	for(j=0;j<size_info;j++)
	{
		if(temp[0]==1)
		{
			for(i=0;i<size_crcpoly;i++)
			{
				s[i]=temp[i]^p[i];
			}
			for(i=0;i<size_crcpoly;i++)
			{
				temp[i]=s[i+1];
			}
			for(i=size_crcpoly;i<size_info+size_crcpoly-1;i++)
			{
				temp[i-1]=temp[i];
			}
		}
		else if(temp[0]==0)
		{
			for(i=0;i<size_crcpoly;i++)
			{
				temp[i]=temp[i+1];
			}
			for(i=size_crcpoly;i<size_info+size_crcpoly-1;i++)
			{
				temp[i-1]=temp[i];
			}
		}
	}
 
	for(i=0;i<size_info;i++)
	{
		crccode_output[i]=array[i];		
	}

	//CRC校验比特
    for(i=0;i<size_crcpoly-1;i++)
	{
		crccode_output[size_info+i]=temp[i];
		
	}  
//for(i=0;i<size_info+size_crcpoly-1;i++)	
//    printf("%2d",crccode_output[i]);
	//释放内存
	delete [] s;
	delete [] temp;	
}


//CRC译码函数
void crcdecode(unsigned array[],unsigned p[],unsigned size,unsigned size_crcpoly,unsigned output[])
{
	unsigned i=0,j=0;
    unsigned *s;
	unsigned *temp;
    s=new unsigned[size_crcpoly];
	temp=new unsigned[size-size_crcpoly+1];

	for(i=0;i<size-size_crcpoly+1;i++)
	{
		temp[i]=array[i];
    }
	
    for(j=0;j<size-size_crcpoly+1;j++)
	{
		if(array[0]==1)
		{
			for(i=0;i<size_crcpoly;i++)
			{
				s[i]=array[i]^p[i];
			}
			for(i=0;i<size_crcpoly;i++)
			{
				array[i]=s[i+1];
			}
			for(i=size_crcpoly;i<size-1;i++)
			{
				array[i-1]=array[i];
			}
		}
		else if(array[0]==0)
		{
			for(i=0;i<size_crcpoly;i++)
			{
				array[i]=array[i+1];
			}
			for(i=size_crcpoly;i<size-1;i++)
			{
				array[i-1]=array[i];
			}
		}
	}

    //加CRC校验比特
    for(i=0;i<size_crcpoly-1;i++)
	{
		output[i+size-size_crcpoly+1]=array[i];
	}
    
    for(i=0;i<size-size_crcpoly+1;i++)
	{
		output[i]=temp[i];	
	}
    
	//释放内存
    delete [] s;
	delete [] temp;	
}

//产生随机数种子函数	
void seedrand(void)  
{
	srand(static_cast<unsigned>(time(NULL)));
}

//产生布尔型随机数函数
unsigned bool_random(void) 
{
	int temp=0;
	unsigned rndm;
	temp=rand();
	if(temp<((double)RAND_MAX+1)/2)
		rndm=0;
	else
		rndm=1;
    return rndm;
}

void main()
{
	unsigned p24[]={1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1};  //X24+X23+X6+X5+X+1
    unsigned p16[]={1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1}; //X16+X12+X5+1
    unsigned p12[]={1,1,0,0,0,0,0,0,0,1,1,1,1}; //X12+X11+X3+X2+X+1
    unsigned p8[]={1,1,0,0,1,1,0,1,1}; //X8+X7+X4+X3+x+1

    unsigned length_crcpoly=9;  //校验比特长度加1
	unsigned i;
	unsigned InfoBitLen=0;
	unsigned *input,*crc_encode,*output;

	printf("please input number of information bits:\n");
	scanf("%d",&InfoBitLen);

	printf("\nok\n");
	input=new unsigned[InfoBitLen];
	crc_encode=new unsigned[InfoBitLen+length_crcpoly-1];
    output=new unsigned[InfoBitLen+length_crcpoly-1];

	for(i=0;i<InfoBitLen;i++)
	{
		input[i]=bool_random();
	}

    printf("input bits!\n");
	for(i=0;i<InfoBitLen;i++)
	{
		printf("%2d",input[i]);
	}

	crcencode(input,p8,InfoBitLen,length_crcpoly,crc_encode);

	printf("\noutput bits of CRCencoding!\n");
	for(i=0;i<InfoBitLen+length_crcpoly-1;i++)
	{
		printf("%2d",crc_encode[i]);
	}

	crcdecode(crc_encode,p8,InfoBitLen+length_crcpoly,length_crcpoly,output);

    printf("\noutput bits of CRC decoding!\n");
	for(i=0;i<InfoBitLen+length_crcpoly-1;i++)
	{
		printf("%2d",output[i]);
	}


	delete [] input;
    delete [] crc_encode;
    delete [] output;
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -