當前位置:名人名言大全網 - 短信平臺 - java中CRC算法是個什麽東東

java中CRC算法是個什麽東東

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;

}

}