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
那我想明天可以是我的来世。