본문 바로가기

프로그래밍/JAVA

CRC16-CCITT crc생성함수

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