用JAVA实现CRC16校验码

1.Design

2.Code

import 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 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 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 :410186Case : CRC16TEST (ASCII = 43 52 43 31 36 54 45 53 54)Result : 455243313654455354fb66CRC 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 :435243313654455354fb66Case : 5k (ASCII = 35 6b)Result : 356b3f79CRC 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校验码

相关文章:

你感兴趣的文章:

标签云: