2011-11-01 45 views
0

我需要一个应用程序的CRC校验我在写作,但不能找出在线代码和计算器,我做错了什么。我可能无法正确理解它。这是我需要的:Android 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; 

我写它用于Android设备,从而需要在java中。

回答

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; 
    }