这两天的项目使用CRC检查功能。 网络上大量的例子是针对C、delphi的例子,前期没有做过,理论上也缺乏很多知识。 在这里,关于java如何实现我们希望的CRC检查功能,试着做一下自己的总结。 以下内容是本分在网上的,请有需要的朋友参考。
一.什么是CRC检查:
CRC或循环冗馀校验码(Cyclic Redundancy Check ) :是数据通信领域中最常用的一种纠错码,其特征是信息字段和校验字段的长度可以任意选定。
二、CRC原理:假设码字长度为n,信息字段为k比特,校验字段为r比特,则对于CRC码集中的任何码字都存在r次多项式g(x ),只存在一个
v(x )=a ) x ) g ) x )=xRm(x ) x ) r ) x;
这里,3360m(x )是k次信息多项式,r ) x )是R-1次检查多项式,
g(x )称为生成多项式。
g(x )=g0g1xg2x2.g ) r-1 ) x(r-1 ) gRxR
发射端由所指定的g(x )产生CRC码字,而接收端由所述g(x )验证接收到的CRC码字。
(关于详细的知识,可以在网上找到大量的资料。 这里省略重复说明() (上述是从网络转载的) )。
三、CRC校验码方式是什么:
1字节校验和
CRC-16
这是CRC-16 (模块)
这是CRC-16(sick )
CRC-CCITT(xmodem ) )。
CRC-CCITT(0xffff ) ) )。
CRC-CCITT(0x1d0f ) )。
CRC-CCITT (Kermit )
CRC-DNP
CRC-32
在以上方式中,结果可以作为ASCII、HEX等方式生成
四.使用JAVA进行CRC检查
)1)现将CRC-CCITT的四种方式进行梳理。
公共类CRC {
//*
*CRC-CCITT(Kermit )认证模式
* @param str
* @return
*/
公共字符串CRC _ CCITT _ kermit {
int j,b,rrrc,c,I;
字符串平衡;
int k;
rrrc=0;
tmpBalance=str;
int tmpInt,CharInt;
String tmpChar、tmpStr;
tmpStr=' ';
int High;
int Low;
for(j=1; j=3; j ) {
字符识别符(if (character.isdigit (tmp balance.charat )2*J-2 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) character )
high=integer.parseint (tmp balance.charat )2*j-2 ) ');
} else {
High=0;
}
if (character.isdigit (tmp balance.charat (2* j-1 ) ) ) ) ) ) ) ) ) ) ) if ) ) ) ) ) 65
low=integer.parseint (tmp balance.charat )2*j-1 ) ');
} else {
Low=0;
}
high=(high0xff ) 4;
高=高|低;
k=High;
for(I=1; i=8; I ) {
c=rrrc 1;
rrrc=rrrc 1;
if () ) k1 )!=0}{
rrrc=rrrc |0x8000;
}
if(c!=0}{
rrrc=rrrc ^0x8408;
}
k=k 1;
}
}
for(I=1; i=16; I ) {
c=rrrc 1;
rrrc=rrrc 1;
if(c!=0}{
rrrc=rrrc ^0x8408;
}
}
c=rrrc 8;
b=rrrc 8;
rrrc=c | b;
tmpInt=rrrc;
tmpStr=' ';
for(I=1; i=4; I ) {
tmpChar=' ';
CharInt=tmpInt % 16;
if(Charint9) {
sitch(charint ) {
case 10:
tmpChar='A ';
布雷克;
case 11:
tmpChar='B ';
布雷克;
case 12:
tmpChar='C ';
布雷克;
case 13:
tmpChar='D ';
布雷克;
case 14:
tmpChar='E ';
布雷克;
case 15:
tmpChar='F ';
布雷克;
}
} else {
tmpchar=integer.tostring (charint );
}
tmpInt=tmpInt/16;
tmpStr=tmpChar tmpStr;
}
system.out.println(tmpstr: ) tmpstr );
return tmpStr;
}
//*
*CRC-CCITT(xmodem )
*CRC-CCITT(0xffff ) )
*CRC-CCITT(0x1d0f ) )
*验证模式
*@paramflagxmodem(flag=1)0x ffff (flag=2)0x 1d 0f (flag=3) ) ) ) ) ) ) ) ) ) ) )。
* @param str
* @return
*/
公共字符串CRC _ CCITT (intflag,String str )。
int crc=0x00; //initial value
int polynomial=0x1021;
byte[] bytes=str.getBytes (;
开关(flag ) {
case 1:
crc=0x00;
布雷克;
case 2:
crc=0xFFFF;
布雷克;
case 3:
crc=0x1D0F;
布雷克;
}
for(intindex=0; index bytes.length; 索引) {
byte b=bytes[index];
for(intI=0; i 8; I ) {
booleanbit=() b )7-I )1)==1);
布尔c15=((CRC 151 )==1);
crc=1;
if(C15^bit ) crc ^=polynomial;
}
}
crc=0xffff;
str=integer.toHEXstring(CRC;
return str;
}
共享至:
2011-03-17 08:30
浏览322
评论