2011-11-01 2 views
0

필자는 응용 프로그램을 작성하기 위해 CRC 검사가 필요하다. 그러나 온라인 코드와 계산기에 대해 무엇이 잘못되었는지를 파악할 수 없다. 나는 그것을 정확하게 이해하지 못할 수도 있습니다. 이것은 내가 필요한 것입니다 :안드로이드 CRC-CCITT

그것은 반전 입력 비트 순서로 0xFFFF의 시작 값으로 CRC-CCITT를 사용합니다. 예를 들어 장치 유형 가져 오기 메시지는 0x01, 0x06, 0x01, 0x00, 0x0B, 0xD9입니다. CRC는 0xD90B입니다.

그리고 이것은 사용하여 코드 임입니다 :

public static int CRC16CCITT(byte[] bytes) { 
    int crc = 0xFFFF;   // initial value 
    int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) 

    for (byte b : bytes) { 
     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; 
    //System.out.println("CRC16-CCITT = " + Integer.toHexString(crc)); 
    return crc; 

임 안드로이드 장치를 쓰기 때문에 자바에 있어야합니다.

답변

1

다음은 내 앱에서 사용하는 코드입니다 (작동 함).

static public int GenerateChecksumCRC16(int bytes[]) { 

     int crc = 0xFFFF; 
     int temp; 
     int crc_byte; 

     for (int byte_index = 0; byte_index < bytes.length; byte_index++) { 

      crc_byte = bytes[byte_index]; 

      for (int bit_index = 0; bit_index < 8; bit_index++) { 

       temp = ((crc >> 15))^((crc_byte >> 7)); 

       crc <<= 1; 
       crc &= 0xFFFF; 

       if (temp > 0) { 
        crc ^= 0x1021; 
        crc &= 0xFFFF; 
       } 

       crc_byte <<=1; 
       crc_byte &= 0xFF; 

      } 
     } 

     return crc; 
    }