本文目錄一覽:
- 1、java中CRC算法是個什麼東東
- 2、用java編寫一個獲得CRC校驗碼的javabean
- 3、JAVA怎麼做CRC校驗的程序
- 4、求CRC-32/MPEG-2 的java實現
- 5、用Java vb 語言實現CRC編碼,即輸入一個比特序列號,輸出完整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; // 116;
int pp2 = 69665; // (116) + (112) + (15) + 1
for(int i=0;ib.length;i++){
for(int j=0;j8;j++){
CRC_x = (short)((CRC_x1) + (((b[i]j)0x80)7));
if((CRC_x/pp) == 1){
CRC_x=(short)(CRC_x^pp2);
}
}
}
return CRC_x;
}
}
用java編寫一個獲得CRC校驗碼的javabean
private static String mkCrc16(String str) {
CRC16 crc16 = new CRC16();
byte[] b = str.getBytes();
for (int i = 0; i b.length; i++)
crc16.update(b[i]);
return Integer.toHexString(crc16.value);
}
private static String mkCrc(String string) throws Exception {
CRC32 crc32 = new CRC32();
crc32.update(string.getBytes());
return Long.toHexString(crc32.getValue());
}
public class CRCUtil {
public static final int evalCRC16(byte[] data) {
int crc = 0xFFFF;
for (int i = 0; i data.length; i++) {
crc = (data[i] 8) ^ crc;
for (int j = 0; j 8; ++j)
if ((crc 0x8000) != 0)
crc = (crc 1) ^ 0x1021;
else
crc = 1;
}
return (crc ^ 0xFFFF) 0xFFFF;
}
}
JAVA怎麼做CRC校驗的程序
實現方法:最簡單的校驗就是把原始數據和待比較數據直接進行比較,看是否完全一樣這種方法是最安全最準確的。同時也是效率最低的。
應用例子:龍珠cpu在線調試工具bbug.exe。它和龍珠cpu間通訊時,bbug發送一個位元組cpu返回收到的位元組,bbug確認是剛才發送位元組後才繼續發送下一個位元組的。 實現方法:在數據存儲和傳輸中,位元組中額外增加一個比特位,用來檢驗錯誤。校驗位可以通過數據位異或計算出來。
應用例子:單片機串口通訊有一模式就是8位數據通訊,另加第9位用於放校驗值。
bcc異或校驗法(block check character)
實現方法:很多基於串口的通訊都用這種既簡單又相當準確的方法。它就是把所有數據都和一個指定的初始值(通常是0)異或一次,最後的結果就是校驗值,通常把它附在通訊數據的最後一起發送出去。接收方收到數據後自己也計算一次異或和校驗值,如果和收到的校驗值一致就說明收到的數據是完整的。
校驗值計算的代碼類似於:
unsigned uCRC=0;//校驗初始值
for(int i=0;iDataLenth;i++) uCRC^=Data[i];
適用範圍:適用於大多數要求不高的數據通訊。
應用例子:ic卡接口通訊、很多單片機系統的串口通訊都使用。 (Cyclic Redundancy Check)
實現方法:這是利用除法及餘數的原理來進行錯誤檢測的
求CRC-32/MPEG-2 的java實現
/******************************************************************************
* Name: CRC-32/MPEG-2 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
* Poly: 0x4C11DB7
* Init: 0xFFFFFFF
* Refin: False
* Refout: False
* Xorout: 0x0000000
* Note:
*****************************************************************************/
uint32_t crc32_mpeg_2(uint8_t *data, uint_len length)
{
uint8_t i;
uint32_t crc = 0xffffffff; // Initial value
while(length–)
{
crc ^= (uint32_t)(*data++) 24;// crc ^=(uint32_t)(*data)24; data++;
for (i = 0; i 8; ++i)
{
if ( crc 0x80000000 )
crc = (crc 1) ^ 0x04C11DB7;
else
crc = 1;
}
}
return crc;
}
————————————————
版權聲明:本文為CSDN博主「e1ki0lp」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:
用Java vb 語言實現CRC編碼,即輸入一個比特序列號,輸出完整CRC碼字
知道了基本原理其實自己去網上找點現成的代碼就行了 crc分為左移和右移倆種,而左移和右移又分為按位和按位元組求crc碼。 剛開始看會很鬱悶,我這也是最近在看代碼,很想知道其中的原理,但是網上的都是千篇一律的,只是講一下單一的左移 右移的情況講的很少,而且右移的時候要還要對G(X)進行鏡像,看了好多才明白過來。
採納哦
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/181877.html