由于工作需要,完成上下微机的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;
}
}
分享到:
相关推荐
在Java中实现CRC算法,通常涉及以下几个关键步骤: 1. **选择CRC多项式**:CRC有不同的版本,如CRC-8、CRC-16、CRC-32和CRC-64,每种对应不同的预定义多项式。例如,CRC-32使用的多项式是0x4C11DB7,CRC-16可能是0...
在PB语言环境下,开发者可以根据MODBUS协议的要求,利用编程语言的特性,实现相应的CRC16校验算法,确保数据传输的准确性。 PB语言,即PowerBuilder,是一种编程语言,通常用于开发企业级的应用程序。在PB语言中...
标题中的“java编写的两个modbus CRC16实现”指的是使用Java编程语言实现的两种Modbus协议中的CRC16校验方法。CRC(Cyclic Redundancy Check,循环冗余校验)是一种广泛用于数据传输错误检测的校验码技术,而Modbus...
在本文中,我们介绍了CRC16校验算法的原理,并使用C#语言实现了CRC16校验算法。我们还将其应用于串口通信中,以检测数据传输中的错误。CRC16校验算法是一种简单而有效的错误检测方法,广泛应用于数据传输和存储中。
计算字符串或文件的Crc32代码,提供标准的API,适应各语言开发的系统中调用,且与JAVA自身(import java.util.zip.CRC32)的CRC32算法计算结果相同。 // 获取计算字符Crc32代码 // 以10进制返回Crc32代码 CRC32_API ...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...
### CRC算法详解 ...CRC-16和CRC-32是两种常见的CRC算法变体,分别使用16位和32位的校验值。通过预先计算查找表,可以显著提高CRC算法的计算效率。CRC算法在通信协议、文件系统、压缩算法等领域有着广泛的应用。
CRC-16是CRC算法的一种,它生成一个16位的校验码,能有效地检测出数据中的错误。 STM32是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M内核的微控制器系列,具有高性能、低功耗、丰富的外设等特点。在...
在Java编程语言中,实现CRC16校验算法通常包括以下步骤: 1. **定义CRC生成多项式**: Modbus协议中常用的CRC16生成多项式是`0x8005`(16进制)。这个值表示了一个16位二进制数,其中左起第16位为1,其余位根据生成...
在Java编程语言中实现CRC16校验可以帮助开发者创建可靠的数据传输系统,特别是对于Modbus协议等工业通信标准而言,CRC16是不可或缺的一部分。 CRC,全称Cyclic Redundancy Check(循环冗余校验),是一种利用多项式...
在软件实现中,可以使用软件来实现CRC算法,例如使用C语言或Java语言来实现CRC算法。 在CRC算法实现中,需要了解生成多项式的概念。生成多项式是指在CRC算法中用来产生CRC码的多项式。例如,CRC-ITU的生成多项式为...
Java 语言提供了实现 CRC 计算的方法,这对于保证数据的完整性和一致性至关重要。 CRC 的基本原理是通过附加一个固定长度的校验位来扩展原始数据,使得整个数据流能通过一个预定义的除法运算(通常是多项式除法)...
在Java编程语言中实现CRC-16,可以帮助开发者检测数据在传输过程中的错误,确保数据的正确性。 描述中提到的"Program to calculate cyclic redundancy check crc16 written in Java",指的是一个用Java编写的程序,...
在CRC-16-CCITT中,32示例代码可能包含不同编程语言实现的CRC-16-CCITT函数,例如在C++、Python或Java中。这些代码通常会包括以下几个关键步骤: 1. 初始化:设置初始的CRC寄存器值,通常是全1(FFFF)。 2. 循环...
在Java编程语言中实现CRC校验,可以帮助开发者确保数据的完整性和一致性,尤其是在安卓应用开发中,这对于保证应用程序的正常运行至关重要。 CRC的基本原理是基于多项式除法,通过对数据进行特定算法计算,生成一个...
CRC16(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储领域的错误...通过分析和理解提供的源代码,开发者不仅可以学习如何实现CRC16算法,还可以深入掌握C++编程技巧和Windows应用程序开发。
在Java环境下实现SimHash算法,可以帮助开发者在处理大量文本数据时快速识别重复或相似的信息。 SimHash算法的基本步骤如下: 1. **分词**:首先,我们需要将输入的文本进行分词,将连续的字符序列分割成单独的...
在Java编程语言中,实现哈希算法可以方便地用于数据验证、查找表以及密码存储等多种用途。本篇文章将详细讨论几种常见的哈希算法及其在Java中的实现。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛...
在硬件实现CRC算法时,通常使用移位寄存器和逻辑门电路,通过一系列的移位和异或操作模拟模2除法。而在软件实现,比如使用JAVA编程语言时,可以采用位操作或者表格查找的方法来计算CRC码。JAVA中,CRC16的实现通常会...
这些代码通常由编程语言编写,如C、C++、Python或Java,它们实现了计算和验证CRC16校验码的功能。通过对这些代码的分析和学习,我们可以更好地理解CRC16的工作机制,并将其应用于实际项目中,确保数据传输的可靠性。...