http://hi.baidu.com/fanthes/blog/item/f684e5cdc061f3510eb34503.html
1.Design 2.Codeimport java.io.IOException; public class CRC16Checker { private static int[] index = new int[] { 16, 15, 2, 0 }; private static int[] getBinary(String text) { StringBuffer num = new StringBuffer(); String s; char ch; for (int i = 0; i < text.length(); i++) { // Change each char to binary code. s = Integer.toBinaryString(text.charAt(i)); // If the code is less than 8 bit, make it as 8 bit. for (int j = 8 - s.length(); j > 0; j--) num.append(0); num.append(s); } int len = num.length(); int[] code = new int[len]; for (int i = 0; i < len; i++) // Change each 0/1 char to int. code[i] = Character.getNumericValue(num.charAt(i)); return code; } private static String toHex(int[] num) { StringBuffer hex = new StringBuffer(num.length / 4); char[] ch = new char[4]; for (int i = 0; i < num.length;) { // Change each 0/1 int to char. ch[0] = Character.forDigit(num[i++], 2); ch[1] = Character.forDigit(num[i++], 2); ch[2] = Character.forDigit(num[i++], 2); ch[3] = Character.forDigit(num[i++], 2); // Change each 4-bit-code to hex number. hex.append(Integer.toHexString(Integer.parseInt(String.valueOf(ch), 2))); } return hex.toString(); } // CRC codes main process public static int[] makeCRCCodes(int[] sourceCodes, int[] multinomial) { // The lenght of CRC code is N bits longer than source code. The codes // from 0 to sourceLength are same as the source. N bits after source // are the CRC codes. N is decided by the multinomial. // CRC码数组总长为原码长加上校验码码长。数组前部存放原码。校验码存放在数组 // 最后的N位。校验码长度决定于生成多项式数组0位置上的元素。 int sourceLength = sourceCodes.length; int codesLength = sourceLength + multinomial[0]; int[] crcCodes = new int[codesLength]; // Copy source code from 0 to sourceLength. 拷贝原码。 System.arraycopy(sourceCodes, 0, crcCodes, 0, sourceLength); int temp, pos; // Division system. 除法器。 for (int i = 0; i < sourceLength; i++) { // Count value of the input adding the first register. // 用第i位原码和第一个寄存器值模二加。 temp = (crcCodes[sourceLength] + sourceCodes[i]) % 2; // Move registers forwards from (1, length) to (0, length - 1). // 第二个寄存器及以后的所有寄存器值前移1位。 System.arraycopy( crcCodes, sourceLength + 1, crcCodes, sourceLength, multinomial[0] - 1); // Set the last register with counted value. // 最后一个寄存器值存放计算好的输入值。 crcCodes[codesLength - 1] = temp; // Count other registers. 按生成多项式的值算出位置,模二加出该寄存器的值。 for (int j = index.length - 2; j > 0; j--) { pos = codesLength - multinomial[j] - 1; crcCodes[pos] = (crcCodes[pos] + temp) % 2; } } return crcCodes; } public static void main(String[] args) throws IOException { System.out.print("Input hex data :"); StringBuffer buf = new StringBuffer(); char ch = (char) System.in.read(); while (ch != '\r' && ch != '\n') { buf.append(ch); ch = (char) System.in.read(); } // Get binary codes. int[] b = CRC16Checker.getBinary(buf.toString()); // Make CRC codes. b = CRC16Checker.makeCRCCodes(b, CRC16Checker.index); // Output code as binary number. for (int i = 0; i < b.length;) { for (int j = 0; j < 4; j++, i++) System.out.print(b[i]); System.out.print(' '); } System.out.println(); // Output code as hex number. System.out.println("The CRC16 code is :" + CRC16Checker.toHex(b)); }} 3. Test report :Case : A (ASCII = 41)Result : 410186CRC bits : 0168 (0000 0001 1000 0110)Run program :Input hex data :A0100 0001 0000 0001 1000 0110The CRC16 code is :410186 Case : CRC16TEST (ASCII = 43 52 43 31 36 54 45 53 54)Result : 455243313654455354fb66 CRC bits : fb66 (1111 1011 0110 0110)Run program :Input hex data :CRC16TEST0100 0011 0101 0010 0100 0011 0011 0001 0011 0110 0101 0100 0100 0101 0101 0011 0101 0100 1111 1011 0110 0110The CRC16 code is :435243313654455354fb66 Case : 5k (ASCII = 35 6b)Result : 356b3f79 CRC bits : 3f79 (0011 1111 0111 1001)Run program :Input hex data :5k0011 0101 0110 1011 0011 1111 0111 1001The CRC16 code is :356b3f79
分享到:
相关推荐
java实现CRC16校验功能~ 测试下载,直接运行即可!用的好的给个好评~
从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。
CRC16校验算法及十六进制和十六进制字符串转换
java ModBus CRC 16 校验_(亲测成功) 还有一个在线版本的 https://www.lammertbies.nl/comm/info/crc-calculation.html
ModBus通讯,CRC校验码生成,Java版实现;ModBus,CRC,Java版实现
简易版的CRC16校验码计算工具,与串口助手的绝配!如果存在什么BUG欢迎可以提出??无法运行的话,请按照java的运行环境。
标准的CCITT校验,CRC16位码,很准确,网上找的好多都不靠谱,这个是经过多伦测试出的结果,和C通信校验完全一致
Java Crc16校验码
Modbus RTU CRC-16校验码生成器 CRC_Calc v0.3 这是最新版,多达21种CRC生成公式。体积小巧,免安装,是程序员工程师必备的神器,巴拉巴拉
CRC 12校验JAVA版 public class CRCtext { public static void main String[] args { CRC } }
用于计算CRC16校验,网络传输校验
crc校验,输入一个数组,返回一个数组,返回的数组比原数组 多了两个字节,也就是两个校验码,低字节在前,高字节在后.
最近在开发javaSocket和C的通信,其中有数据校验就是采用CCITT方式,在网上找了好多,都不切合实际使用,经过一个星期的奋斗查资料,再根据网上搜获,写出了一套标准的校验方法,结果和C语言的校验一直,其中考虑了...
PB 语言编写的基于MODBUS协议的CRC16校验算法,已验证结果正确。属于程序代码,有问题可以联系QQ:441965142
ModbusCRC16这是一个符合modbus协议的CRC16校验算法的java代码的实现
modbus 校验码 java的实现类 调用getCRC 方法就可以自动给所传字符串尾部补充校验码
CRC16循环冗余算法,高位在前和低位在后都有;...对特定字符串进行转换成16进制字符串,然后将字符串进行CRC16校验,得到校验码. 次工具类已经经过本人亲自验证,完全符合标准,目前项目中用到的就是这个工具类.
4、实现功能:对保存在TXT文件中的一组数据进行CRC16校验,输出校验码,并将校验码和原数据进行打包 5、涉及知识点 (1)界面、按钮和文本框显示和布局 (2)添加按钮的响应事件 (3)弹出文件选择对话框,并打开...
capl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算.zipcapl实现crc校验码计算....
crc16校验工具类,从消息头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021