?? 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 + -