-
Notifications
You must be signed in to change notification settings - Fork 9
/
CRCUtil.java
98 lines (80 loc) · 2.27 KB
/
CRCUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package <package_name>
public class CRCUtil {
/**
* converts the given String to CRC16
*
* @param inputStr
* - the input string to get the CRC
* @param polynomial
* - the polynomial (divisor)
* @param crc
* - the CRC mask
* @param isHex
* - if true, treat input string as hex, otherwise, treat as
* ASCII
* @return
*/
public static String getCRC16CCITT(String inputStr, int polynomial,
int crc, boolean isHex) {
int strLen = inputStr.length();
int[] intArray;
if (isHex) {
if (strLen % 2 != 0) {
inputStr = inputStr.substring(0, strLen - 1) + "0"
+ inputStr.substring(strLen - 1, strLen);
strLen++;
}
intArray = new int[strLen / 2];
int ctr = 0;
for (int n = 0; n < strLen; n += 2) {
intArray[ctr] = Integer.valueOf(inputStr.substring(n, n + 2), 16);
ctr++;
}
} else {
intArray = new int[inputStr.getBytes().length];
int ctr=0;
for(byte b : inputStr.getBytes()){
intArray[ctr] = b;
ctr++;
}
}
// main code for computing the 16-bit CRC-CCITT
for (int b : intArray) {
for (int i = 0; i < 8; i++) {
boolean bit = ((b >> (7 - i) & 1) == 1);
boolean c15 = ((crc >> 15 & 1) == 1);
crc <<= 1;
if (c15 ^ bit)
crc ^= polynomial;
}
}
crc &= 0xFFFF;
String crcStr = Integer.toHexString(crc).toUpperCase();
int n = crcStr.length();
for(int i=0; i<(4-n); i++){
crcStr = "0" + crcStr;
}
return crcStr;
}
public static void main(String args[]) {
String testStr = "123456789";
// XModem ASCII
System.out.println("CRC-CCITT (XModem) Ascii: "
+ getCRC16CCITT(testStr, 0x1021, 0x0000, false));
// 0xFFFF ASCII
System.out.println("CRC-CCITT (0xFFFF) Ascii: "
+ getCRC16CCITT(testStr, 0x1021, 0xFFFF, false));
// 0x1D0F ASCII
System.out.println("CRC-CCITT (0x1D0F) Ascii: "
+ getCRC16CCITT(testStr, 0x1021, 0x1D0F, false));
// XModem Hex
System.out.println("CRC-CCITT (XModem) Hex: "
+ getCRC16CCITT(testStr, 0x1021, 0x0000, true));
// 0xFFFF Hex
System.out.println("CRC-CCITT (0xFFFF) Hex: "
+ getCRC16CCITT(testStr, 0x1021, 0xFFFF, true));
// 0x1D0F Hex
System.out.println("CRC-CCITT (0x1D0F) Hex: "
+ getCRC16CCITT(testStr, 0x1021, 0x1D0F, true));
}
}