📄 crc.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 + -