直接貼代碼了,功能比較全吧!
/*<br /> * crc.cpp<br /> *<br /> * Created on: 2010-3-30<br /> * Author: wzw<br /> */<br />#include "stdio.h"<br />#include "conio.h"<br />void getMagAppendZeroBit(int Frame[],int Length_Frame,int Length_Gx,int Out[]);<br />void getRemainder(int Frame[],int Length_Frame,int Gx[],int Length_Gx,int Remainder[]);<br />void NandCal(int X[],int Gx[],int Length,int Out[]);<br />void AppendOneToY(int X,int Y[],int Length_Y,int Out[]);<br />void PrintRemainder(int Remainder[],int Length_Remainder);<br />void PrintFrameAndGx(int FrameMatrix[],int Length_Frame,int GxMatrix[],int Length_Gx);<br />void PrintTransmitterFrame(int Frame[],int Length_Frame,int Remainder[],int Length_Remainder);<br />int main(){<br />int LengthOfFrame;<br />int LengthOfGx;<br />printf("Input The Length Of Frame:/n");<br />scanf("%d",&LengthOfFrame);<br />int FrameMatrix[LengthOfFrame];<br />for (int i=0;i<LengthOfFrame;i++){ //迴圈輸入資料<br />printf("Input The %dth Bit/n",i+1);<br />int temp;<br />temp=(int)getche()-48;<br />if((temp==0)||(temp==1)){ //確保輸入資料時0或1<br />FrameMatrix[i]=temp;<br />printf("/n");<br />}<br />else{<br />printf("/nInput Must Be 0 Or 1/n");<br />i--;<br />}<br />}<br />printf("Press C/c For Custom Or Other Keys for Standard Generator?/n");<br />char ChooseMode;<br />ChooseMode=getche();<br />printf("/n");<br />if(ChooseMode=='C'||ChooseMode=='c'){//自訂Gx<br />printf("Input The Length Of G(x):/n");<br />scanf("%d",&LengthOfGx);<br />int GxMatrix[LengthOfGx];<br />for (int i=0;i<LengthOfGx;i++){ //迴圈輸入GX<br />printf("Input The %dth Bit/n",i+1);<br />int temp;<br />temp=(int)getche()-48;<br />printf("/n");<br />if((temp==0)||(temp==1)){ //確保輸入資料時0或1<br />if((i==0)&&(temp==0)){<br />printf("The First Bit Must Be 1/n");<br />i--;<br />}<br />else if((i==(LengthOfGx-1))&&(temp==0)){<br />printf("The Last Bit Must Be 1/n");<br />i--;<br />}<br />else{<br />GxMatrix[i]=temp;<br />}<br />}<br />else{<br />printf("Input Must Be 0 Or 1/n");<br />i--;<br />}<br />}<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />else{//通用標準Gx<br />printf("/nPress '1' for CRC8 or '2' for CRC12 or '3' for CRC16 or '4' for CRC_CCITT or Other keys for CRC32?/n");<br />char ChooseStandardCRC;<br />ChooseStandardCRC=getche();<br />if(ChooseStandardCRC=='1'){//crc8<br />LengthOfGx=9;<br />int GxMatrix[]={1,0,0,0,0,0,1,1,1};<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />else if(ChooseStandardCRC=='2'){//crc12<br />LengthOfGx=13;<br />int GxMatrix[]={1,1,0,0,0,0,0,0,0,1,1,1,1};<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />else if(ChooseStandardCRC=='3'){//crc16<br />LengthOfGx=17;<br />int GxMatrix[]={1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1};<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />else if(ChooseStandardCRC=='4'){//crc ccitt<br />LengthOfGx=17;<br />int GxMatrix[]={1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1};<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />else{//crc32<br />LengthOfGx=33;<br />int GxMatrix[]={1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1};<br />PrintFrameAndGx(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx);<br />int RemainderMatrix[LengthOfGx-1];<br />getRemainder(FrameMatrix,LengthOfFrame,GxMatrix,LengthOfGx,RemainderMatrix);<br />PrintRemainder(RemainderMatrix,LengthOfGx-1);<br />PrintTransmitterFrame(FrameMatrix,LengthOfFrame,RemainderMatrix,LengthOfGx-1);<br />}<br />}<br />printf("/nPress Any Key To Exit");<br />getch();<br />}<br />void getRemainder(int Frame[],int Length_Frame,int Gx[],int Length_Gx,int Remainder[]){<br />int Length_AppendZeroBit=Length_Frame+Length_Gx-1;<br />int AppendZeroBit[Length_AppendZeroBit];<br />getMagAppendZeroBit(Frame,Length_Frame,Length_Gx,AppendZeroBit);<br />int MagEveryCal[Length_Gx];<br />for(int i=0;i<Length_Gx;i++){<br />MagEveryCal[i]=Frame[i];<br />}<br />NandCal(MagEveryCal,Gx,Length_Gx,Remainder);<br />for(int i=Length_Gx;i<Length_AppendZeroBit;i++){<br />AppendOneToY(AppendZeroBit[i],Remainder,Length_Gx-1,MagEveryCal);<br />NandCal(MagEveryCal,Gx,Length_Gx,Remainder);<br />}<br />}<br />void PrintRemainder(int Remainder[],int Length_Remainder){<br />printf("/nRemainder Code Is:/n");<br />for(int i=0;i<Length_Remainder;i++){<br />printf("%d",Remainder[i]);<br />}<br />printf("/n");<br />}<br />void PrintFrameAndGx(int FrameMatrix[],int Length_Frame,int GxMatrix[],int Length_Gx){<br />printf("/nFrame To Be Sent Is:/n");<br />for(int i=0;i<Length_Frame;i++){<br />printf("%d",FrameMatrix[i]);<br />}<br />printf("/nChoosed G(x) Is:/n");<br />for(int i=0;i<Length_Gx;i++){<br />printf("%d",GxMatrix[i]);<br />}<br />printf("/n");<br />}<br />void PrintTransmitterFrame(int Frame[],int Length_Frame,int Remainder[],int Length_Remainder){<br />printf("/nTransmitter Frame Is :/n");<br />for(int i=0;i<Length_Frame;i++){<br />printf("%d",Frame[i]);<br />}<br />for(int i=0;i<Length_Remainder;i++){<br />printf("%d",Remainder[i]);<br />}<br />printf("/n");<br />}<br />void NandCal(int X[],int Gx[],int Length,int Out[]){<br />for(int i=1;i<Length;i++){<br />if(X[0]==1){<br />Out[i-1]=(X[i]==Gx[i])?0:1;<br />}<br />else{<br />Out[i-1]=X[i];<br />}<br />}<br />}<br />void getMagAppendZeroBit(int Frame[],int Length_Frame,int Length_Gx,int Out[]){ //將幀加上0序列後輸出<br />for(int i=0;i<Length_Frame;i++){<br />Out[i]=Frame[i];<br />}<br />for(int i =0;i<Length_Gx-1;i++){<br />Out[Length_Frame+i]=0;<br />}<br />}<br />void AppendOneToY(int X,int Y[],int Length_Y,int Out[]){<br />for(int i=0;i<Length_Y;i++){<br />Out[i]=Y[i];<br />}<br />Out[Length_Y]=X;<br />}</p><p>
轉載自: http://50vip.com