`
sunguanxing
  • 浏览: 1098070 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CRC16校验码的JAVA实现

阅读更多
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校验功能

    1. `int calculateCRC16(byte[] data)`:此方法接收一个字节数组作为输入,对这些字节进行CRC16计算,并返回16位的CRC校验和。 2. `boolean verifyCRC16(byte[] originalData, byte[] receivedData)`:此方法用于...

    crc16进制校验码-java实现

    ModBus通讯,CRC校验码生成,Java版实现;ModBus,CRC,Java版实现

    crc16校验java实现

    从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。

    Java版CRC16校验算法

    CRC16校验算法及十六进制和十六进制字符串转换

    java实现 crc16校验工具和代码

    余数作为CRC校验码附加到原始数据后面,接收方同样使用该生成多项式对整个数据(包括原始数据和CRC校验码)进行除法运算,若余数为零,则认为数据传输无误。 **CRC16计算步骤** 1. 将原始数据看作高次位在前的二...

    CRC16校验码生成工具

    一款CRC16的校验码生成工具,可以自己设置校验码生成多项式,可以对十六进制序列和文件进行校验,得出16位CRC校验码。字符串需要输入ASCii码形式,例如:AE 13 4F 78 0C 90 A0 B1,每两个中间要加空格,当校验多项式...

    CRC16校验码计算器_V12

    它特别指出与“串口助手”配合良好,这表明CRC16校验码计算器可能集成了一些串行通信的功能,如接收和发送带有CRC校验的数据包,从而帮助用户在调试或测试串口通信时验证数据的正确性。 当遇到无法运行的问题时,...

    CRC16校验码计算工具及源代码

    运算过程中产生的余数就是CRC校验码。这个过程可以转换成移位寄存器和逻辑门的操作,从而实现硬件或软件的高效实现。 在描述中提到的“通道码”是需要进行CRC校验的数据,以十六进制表示并用空格分隔。例如,“68 ...

    java版_ModBus_CRC16校验

    java ModBus CRC 16 校验_(亲测成功) 还有一个在线版本的 https://www.lammertbies.nl/comm/info/crc-calculation.html

    Modbus RTU CRC-16校验码生成器 CRC_Calc v0.3 最新版

    它的基本原理是将待校验的数据视为一个二进制多项式,然后用一个预定义的生成多项式进行除法运算,得到的余数即为CRC校验码。在接收端,接收到的数据与接收方存储的生成多项式再次进行除法运算,如果余数为零,则...

    CRC16 MODBUS校验算法实现

    CRC16 MODBUS校验算法实现涉及到对数据进行特定的计算,以产生一个16位的校验码,这个校验码可以用于检查数据是否在传输过程中发生了错误。 1. CRC16原理 CRC16的核心在于一个称为生成多项式(Generator Polynomial...

    计算法和查表法实现的CRC16校验码生成

    - 用CRC生成多项式对数据进行模2除法,每次除法操作相当于对数据的每一位进行异或操作,如果结果的最高位为1,则将生成多项式的低n位(n为CRC校验码的位数)与数据的下一位异或,如果最高位为0,则不做任何操作。...

    C#实现CRC16校验

    在上面的代码中,我们使用了CRC16校验算法来生成一个十六进制的校验码,然后将其附加到数据的末尾,并将其发送到串口中。在接收端,我们可以使用CRC16校验算法来检测数据传输中的错误。 结论 在本文中,我们介绍了...

    CRC16校验java版

    5. 最终结果:经过上述步骤后,寄存器中的值即为CRC校验码。为了方便比较,通常将其取反(即进行1's Complement操作)。 在Java中实现CRC16,可以创建一个CRC16类,包含一个计算CRC16的方法。CRC16.java文件可能...

    Java 实现CRC码算法(含实现原理和步骤)

    接收端收到数据后,同样使用相同的算法计算接收到的数据的CRC校验值,并与接收到的CRC值进行比较,以此判断数据是否在传输过程中发生了错误。 #### CRC码的关键组成部分 1. **多项式**:CRC算法的基础是基于二进制...

    CRC16 校验JAVA代码

    crc校验,输入一个数组,返回一个数组,返回的数组比原数组 多了两个字节,也就是两个校验码,低字节在前,高字节在后.

    Java编写的CRC校验

    因此,描述中提到的代码应该是一个可以直接在Eclipse中编译运行的Java类或函数,用于计算CRC校验码。 在实际应用中,你可以将这个CRC校验功能封装成一个静态方法,接受字节数组或文件路径作为输入,返回CRC校验码。...

    JAVACRC16标准校验CCITT

    标准的CCITT校验,CRC16位码,很准确,网上找的好多都不靠谱,这个是经过多伦测试出的结果,和C通信校验完全一致

    Java Crc16校验码

    Java Crc16校验码

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

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

Global site tag (gtag.js) - Google Analytics