由于工作需要,完成上下微机的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实现串口全双工通讯 本类库中使用了Java Communication API(javax.comm)。 本程序在Windows 2000 + Java SDK 1.3环境下编译通过并成功运行
利用comm_jar开发包实现Java与单片机全双工串口通信.pdf
利用comm.jar开发包实现Java与单片机全双工串口通信核心分析.pdf
用java编写的一个组件,用于windows下串口通信,我已经试过了,可以成功
java串口通信包,利用comm. jar 开发包实现Java 与单片机 全双工串口通信
java ModBus CRC 16 校验_(亲测成功) 还有一个在线版本的 https://www.lammertbies.nl/comm/info/crc-calculation.html
Java Comm API编程指南.doc Javax.comm简介.doc KEIL中如何用虚拟串口调试串口程序.doc Message PDU编码规则.doc QHDQ-29DDDAD3A0.LOG SMSLib串口通信.doc 串口常用参数.doc 关于java使用javacomm20.doc 常见的进制...
java 串口通信 包 comm.jar win32com.dll javax.comm.properties
1.把javax.comm.properties文件拷贝到Java运行时环境的lib目录中,即: C:\Program Files\Java\jdk1.5.0_12\lib\javax.comm.properties C:\Program Files\Java\jdk1.5.0_12\jre\lib\javax.comm.properties ...
Java,comm是专门为Java读取串口信息的而编写的API,这个既可以读取到串口的信息,也可以进行相关数据的写入到对应的串口中。这个一般刚刚开始,使用简单的代码,进行读取的时候,可能会什么都没有发现,这个是应该,...
Java串口通信简单实现二台电脑串口通信 利用了 comm控件 源代码
comm.jar,javax.comm. properties和win32comm.dll 包括存放位置说明
java串口编程comm.jar 轻松操作串口
Java 的串口通讯类包,将下载的文件解压缩后,在\javacomm20-win32\commapi目录下有必需的三个文件comm.jar,javax.comm. properties和win32comm.dll。将文件comm.jar拷贝到%JAVA_HOME%\jre\lib\ext;文件javax.comm....
在简单介绍ZigBee技术的基础上,论述了在Java程序中利用javax.comm开发包中的类实现微机的RS-232串口与ZigBee模块通信的方法。
利用Sun公司提供的comm.jar包中的API进行函数调用,调用操作系统底层的API函数,设置串口通信的参数,利用Java的输入输出流于串口进行通信。提供了Java的程序 A function call using Sun's comm.jar package API, ...
java串口编程包,很好用 javax.comm.properties win32com.dll comm..jar
利用comm.jar 开发包实现 Java 与单片机
此jar包是JavaComm3串口通信的API,本人在项目中使用此API实现发送手机短信的功能,不过发现Linux平台上,此API可在java Application应用中正常使用,可是如果将项目迁移至Web Application应用,有个无法解决的问题...
javacomm64.zip