`
linduo168
  • 浏览: 16949 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

java语言实现CRC16算法

阅读更多
由于工作需要,完成上下微机的com口的通讯,所以要用JAVA语言实现CRC16算法,完成通讯后字节流的校验功能。 而在编写数据传输程序时,数据容错是一个非常重要的问题。循环冗余位校验(CycliclRedundncyCheck英文简称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;
}
}
分享到:
评论
1 楼 djsl6071 2007-04-29  
谢谢,从你的这几篇通信的文章中受益不少,已经转载了。

相关推荐

    CRC算法 (Java版)

    在Java中实现CRC算法,通常涉及以下几个关键步骤: 1. **选择CRC多项式**:CRC有不同的版本,如CRC-8、CRC-16、CRC-32和CRC-64,每种对应不同的预定义多项式。例如,CRC-32使用的多项式是0x4C11DB7,CRC-16可能是0...

    基于MODBUS协议的CRC16校验算法-PB

    在PB语言中,实现基于MODBUS协议的CRC16校验算法可以使用函数fx_modbus_crc16,该函数可以对输入的字符串进行CRC16校验,并返回16进制字符串的CRC16校验值。 函数fx_modbus_crc16的实现过程可以分为以下几个步骤: ...

    java编写的两个modbus CRC16实现

    标题中的“java编写的两个modbus CRC16实现”指的是使用Java编程语言实现的两种Modbus协议中的CRC16校验方法。CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术,而Modbus...

    C#实现CRC16校验

    在本文中,我们介绍了CRC16校验算法的原理,并使用C#语言实现了CRC16校验算法。我们还将其应用于串口通信中,以检测数据传输中的错误。CRC16校验算法是一种简单而有效的错误检测方法,广泛应用于数据传输和存储中。

    计算字符串或文件的Crc32代码,与JAVA自身的CRC32算法计算结果相同

    计算字符串或文件的Crc32代码,提供标准的API,适应各语言开发的系统中调用,且与JAVA自身(import java.util.zip.CRC32)的CRC32算法计算结果相同。 // 获取计算字符Crc32代码 // 以10进制返回Crc32代码 CRC32_API ...

    crc16/crc32算法

    ### CRC算法详解 ...CRC-16和CRC-32是两种常见的CRC算法变体,分别使用16位和32位的校验值。通过预先计算查找表,可以显著提高CRC算法的计算效率。CRC算法在通信协议、文件系统、压缩算法等领域有着广泛的应用。

    CRC-16_crc16校验stm32_

    CRC-16是CRC算法的一种,它生成一个16位的校验码,能有效地检测出数据中的错误。 STM32是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M内核的微控制器系列,具有高性能、低功耗、丰富的外设等特点。在...

    ModbusCRC16:这是一个符合modbus协议的CRC16校验算法的java代码的实现

    在Java编程语言中,实现CRC16校验算法通常包括以下步骤: 1. **定义CRC生成多项式**: Modbus协议中常用的CRC16生成多项式是`0x8005`(16进制)。这个值表示了一个16位二进制数,其中左起第16位为1,其余位根据生成...

    CRC16校验java版

    在Java编程语言中实现CRC16校验可以帮助开发者创建可靠的数据传输系统,特别是对于Modbus协议等工业通信标准而言,CRC16是不可或缺的一部分。 CRC,全称Cyclic Redundancy Check(循环冗余校验),是一种利用多项式...

    CRC算法与实现.doc

    在软件实现中,可以使用软件来实现CRC算法,例如使用C语言或Java语言来实现CRC算法。 在CRC算法实现中,需要了解生成多项式的概念。生成多项式是指在CRC算法中用来产生CRC码的多项式。例如,CRC-ITU的生成多项式为...

    这是一个符合modbus协议的CRC16校验算法的java代码的实现.zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    java-crc.rar_crc java_crc-ccitt_java crc

    Java 语言提供了实现 CRC 计算的方法,这对于保证数据的完整性和一致性至关重要。 CRC 的基本原理是通过附加一个固定长度的校验位来扩展原始数据,使得整个数据流能通过一个预定义的除法运算(通常是多项式除法)...

    crc-16-java.zip_CRC-16_crc16 java_desfire_desfire ev1_java crc

    在Java编程语言中实现CRC-16,可以帮助开发者检测数据在传输过程中的错误,确保数据的正确性。 描述中提到的"Program to calculate cyclic redundancy check crc16 written in Java",指的是一个用Java编写的程序,...

    CRC-16-CCITT_CRC16art_CRC16CCITT_crc16_ccitt_

    在CRC-16-CCITT中,32示例代码可能包含不同编程语言实现的CRC-16-CCITT函数,例如在C++、Python或Java中。这些代码通常会包括以下几个关键步骤: 1. 初始化:设置初始的CRC寄存器值,通常是全1(FFFF)。 2. 循环...

    JAVA写的CRC校验

    在Java编程语言中实现CRC校验,可以帮助开发者确保数据的完整性和一致性,尤其是在安卓应用开发中,这对于保证应用程序的正常运行至关重要。 CRC的基本原理是基于多项式除法,通过对数据进行特定算法计算,生成一个...

    常用的hash算法(java实现)

    在Java编程语言中,实现哈希算法可以方便地用于数据验证、查找表以及密码存储等多种用途。本篇文章将详细讨论几种常见的哈希算法及其在Java中的实现。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛...

    CRC16校验算法.doc

    在硬件实现CRC算法时,通常使用移位寄存器和逻辑门电路,通过一系列的移位和异或操作模拟模2除法。而在软件实现,比如使用JAVA编程语言时,可以采用位操作或者表格查找的方法来计算CRC码。JAVA中,CRC16的实现通常会...

    simhash-java Java实现simhash算法的简单实现.zip

    在Java环境下实现SimHash算法,可以帮助开发者在处理大量文本数据时快速识别重复或相似的信息。 SimHash算法的基本步骤如下: 1. **分词**:首先,我们需要将输入的文本进行分词,将连续的字符序列分割成单独的...

    CRC16各种模式校验

    这些代码通常由编程语言编写,如C、C++、Python或Java,它们实现了计算和验证CRC16校验码的功能。通过对这些代码的分析和学习,我们可以更好地理解CRC16的工作机制,并将其应用于实际项目中,确保数据传输的可靠性。...

    crc-code.rar_crc java_纠错算法

    在Java中实现CRC算法通常涉及对二进制数据进行位操作,如移位和逻辑运算。下面将详细解释CRC算法的基本原理以及如何在Java中实现它。 **CRC基本原理:** 1. **多项式表示:** CRC是基于二进制域上的除法运算。每个...

Global site tag (gtag.js) - Google Analytics