首页 > 编程知识 正文

javacrc校验码计算,crc32是什么意思

时间:2023-05-03 18:40:58 阅读:138639 作者:3216

这两天的项目使用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

评论

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。