java中CRC算法是个什么东东

CRC算法实现有2种方法,一、查表法,二、直接计算,查表法的计算速度相对来说比较快,本人介绍的方法是直接计算法,用了2种方法实现,都是面向对象进行算法的封装。package com.wms.serial;/ author linduo version 2006/08/25 / public class CRC16{ public int value;public CRC16(){ value =...
java中CRC算法是个什么东东
CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC. CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式有CRC16,CRC32.
以CRC16为例,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以2^16)后,再除以一个多项式,最后所得到的余数既是CRC码,如下式所示,其中K(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
K(X)>>16=G(x)Q(x)+R(x)
求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码
接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
CCITT推荐的高级数据链路控制规程HDLC的帧校验序列FCS中,使用CCITT-16即CRC16,其生成多项式为G(x)=x16+x12+x5+1,CRC-32的生成多项式为G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+12013-05-08
CRC算法实现有2种方法,一、查表法,二、直接计算,查表法的计算速度相对来说比较快,本人介绍的方法是直接计算法,用了2种方法实现,都是面向对象进行算法的封装。
package com.wms.serial;

/**
* @author linduo
* @version 2006/08/25
*/
public class CRC16{
public int value;

public CRC16()
{
value = 0;
}

/** update CRC with byte b */
public void update(byte aByte)
{
int a, b;

a = (int) aByte;
for (int count = 7; count >=0; count--) {
a = a << 1;
b = (a >>>8) & 1;
if ((value & 0x8000) != 0) {
value = ((value << 1) + b) ^ 0x1021;
} else {
value = (value << 1) + b;
}
}
value = value & 0xffff;
return;
}

/** reset CRC value to 0 */
public void reset()
{
value = 0;
}

public int getValue()
{
return value;
}

public static void main(String[] args) {
CRC16 crc16 = new CRC16();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
for (int k = 0; k < b.length; k++)
{
crc16.update(b[k]);
}
System.out.println(Integer.toHexString(crc16.getValue()));
System.out.println(Integer.toHexString(b.length));
}
}

package com.wms.serial;

public class CRC162 {
public static final void main(String[] args){
CRC162 crc16 = new CRC162();
byte[] b = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x00,(byte)0x00
};
System.out.println(Integer.toHexString(crc16.encode(b)));
//再把这个2f49替换成b数组的最后两个字节的数组,生成一个新的数组b2
byte[] b2 = new byte[]{
//(byte) 0xF0,(byte)0xF0,(byte)0xF0,(byte)0x72
(byte) 0x2C,(byte)0x00,(byte)0xFF,(byte)0xFE
,(byte) 0xFE,(byte)0x04,(byte)0x00,(byte)0x00
,(byte) 0x2f,(byte)0x49
};
System.out.println(Integer.toHexString(crc16.encode(b2))); //算出来是 0

//你可以自已构造一些byte进行加解密试试
}

public short encode(byte[] b){
short CRC_x = 0;
int pp = 65536; // 1<<16;
int pp2 = 69665; // (1<<16) + (1<<12) + (1<<5) + 1
for(int i=0;i<b.length;i++){
for(int j=0;j<8;j++){
CRC_x = (short)((CRC_x<<1) + (((b[i]<<j)&0x80)>>7));
if((CRC_x/pp) == 1){
CRC_x=(short)(CRC_x^pp2);
}
}
}
return CRC_x;
}
}2013-05-08
不懂。同楼主!2013-05-08
mengvlog 阅读 8 次 更新于 2025-07-20 08:58:18 我来答关注问题0
  •  文暄生活科普 16位的crc校验如何把c实现的用java实现?

    crc

  • anonymous java的crc8校验,按指定多项式,求助

    以下是我的分析,不知是否正确,你参考下1、首先来看你打java代码:crc=(byte)((crc>>1)^0x8c);和 crc=(byte)(crc>>1); 导致这个问题是因为byte的最高位符号位,转换的时候就出错了2、示例代码:package com.test;public class test {public static void main(String[] args) {byte[] ...

  •  longlegthy 常用数据校验方法有哪些?

    MD5广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的,用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,来验证该用户的合法性。MD5校验值软件WinMD5.zip汉化版,使用极其简单,运行该软件后,把需要计算MD5值的文件用鼠标拖到正...

  •  fylsh 求java的 crc8算法方法

    你的意思就翻译一下,是吗:static char crc8fun ( char in, char prest){ int loop;char out;char crc_pol=0xb8; /*多项式*/ out = in^prest;for(loop=0;loop>1)^crc_pol;}else{ out=(out>>1);} return out;} } ...

  • anonymous 如何用java语言对即时通讯软件进行加密

    为了保护用Java语言开发的软件,我们设计并实现了一个实用、高强度的加密算法。以下称需要保护的Java软件为“受保护程序”,称对“受保护程序”进行加密保护的软件为“加密程序”。对软件加密保护的流程如图1所示。三、加密算法分析设计 1、用户信息提取器设计 为了防止用户发布序列号而导致“一次发行,到处...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部