Reference : http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java
additional
1. ascii string to hex value
2. reverse bits
3. last xor : 0xffff
4. crc byte-order
public static String makeCRC16_CCITT( String hexString, boolean isReverse) throws Exception {
int len = hexString.length();
if( len % 2 != 0 ) {
throw new Exception("HEX format exception");
}
byte[] input = hexString.getBytes();
byte[] hex = new byte[input.length/2];
// 2bytes ascii code -> 1byte value
int cnt=0;
for( int i=0; i<input.length; i+=2 ) {
int val1 = Character.getNumericValue(input[i]);
int val2 = Character.getNumericValue(input[i+1]);
if( val1 < 0 || val2 < 0 ) {
throw new Exception("HEX format exception");
}
hex[cnt] = (byte) ((val1<<4) + val2);
}
// Reflected In
if( isReverse ) {
for( int i=0; i<hex.length; i++ ) {
int in = (int) (hex[i]&0xff);
int temp = 0;
int out = 0;
for( int j=0; j<8; j++ ) {
temp = (in>>j)&0x01;
out = (out << 1) + temp;
}
hex[i] = (byte) out;
}
}
// Initialization value
int crc = 0xFFFF;
// Polynomial
int polynomial = 0x1021;
// CRC
for (byte b : hex) {
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;
}
}
// Reflected Out : reverse crc bits
if( isReverse ) {
int temp = 0;
int out = 0;
for( int i=0; i<16; i++ ) {
temp = (crc>>i)&0x01;
out = (out << 1) + temp;
}
crc = out;
}
crc&=0xffff;
// last xor
crc = crc^0xffff;
// big-endian to little-endian
int temp = (crc>>8) & 0xff;
crc = ((crc&0xff)<<8 ) + temp;
return Integer.toHexString(crc);
}
'프로그래밍 > JAVA' 카테고리의 다른 글
Apache HttpClient 관련 정리 (0) | 2014.03.11 |
---|---|
[JAVA TV] MHP 배경이미지 처리 (0) | 2013.12.27 |
[JAVA TV] 타이머 (0) | 2013.12.27 |
[awt] 이미지 읽기~ (0) | 2013.12.17 |
GSON 간단 사용 예 (0) | 2013.09.12 |
ExecutorService (0) | 2012.05.11 |
정규식 표현 (0) | 2012.04.05 |
클래스 동적 생성,호출 (리플렉션) (0) | 2010.09.04 |
이클립스(갈릴레오) SVN 설정 (0) | 2009.11.12 |
쓰레드 기본 (0) | 2009.11.10 |