由于工作需要,完成上下微机的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 编写实现的CRC32算法,很详细
CRC16校验算法及十六进制和十六进制字符串转换
CRC算法,包含8/16/32/64位 CRC校验算法,Java语言实现。
JAVA下使用两种方法(计算法、查表法)实现CRC(XMODEM)算法,以及验证代码
CRC16,CRC-CCITT JAVA算法
CRC16算法
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。
自己写的一个crc16校验的代码,本人就在使用,很好用的,很方便。
java实现CRC16校验功能~ 测试下载,直接运行即可!用的好的给个好评~
附件是CRC16 MODBUS校验算法实现 分两种情况: 1、参数是字符串,见附件中CRCStrTest.java文件 2、参数是字节数组,见附件中CRCByteTest.java文件
C语言实现标准CRC16校验 ,文件包含crc.h 和crc.c,有问题可以 私聊我 q-175-543-7233
CRC16循环冗余算法,高位在前和低位在后都有; 对特定字符串进行转换成16进制字符串,然后将字符串进行CRC16校验,得到校验码. 次工具类已经经过本人亲自验证,完全符合标准,目前项目中用到的就是这个工具类.
crc8源码JAVA查表法实现,已测试通过。
CRC16算法原理 CRC算法及C实现
以16位CRC - 16校验码为例,在对CRC校验码原理和一般的串行CRC生成算法进行分析的基础上,改进 了串行CRC算法,并进一步推导出并行CRC算法。利用Quartus II集成环境和Verilog HDL语言工具将算法转 变为校验码生成电路,...
易语言源码,crc16算法,此算法是我做工业流水线显示屏时而编写,研究crc16算法三四天,比较难理解。愿与大家交流。QQ:407863182
C#实现 CRC16 MODBUS算法 工业制造常用
C#写的CRC16校验算法,分为CRC16和ModbusCRC16两种,使用方法请参考Demo
PB 语言编写的基于MODBUS协议的CRC16校验算法,已验证结果正确。属于程序代码,有问题可以联系QQ:441965142
java ModBus CRC 16 校验_(亲测成功) 还有一个在线版本的 https://www.lammertbies.nl/comm/info/crc-calculation.html