crc編碼實現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; // 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-23 06:42
下一篇 2024-11-23 06:43

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論