2012-11-03 13 views
7

Şu anda bir projede, radyo aracılığıyla bir bilgisayara veri gönderen yerleşik bir sisteme sahip bir projede çalışıyorum. paketler sonunda bir CRC16 sağlama almak ve bu algoritmaya göre hesaplanır oluyor: C CRC16'yı Java CRC16'ya Dönüştürme

uint16_t crc16 (const uint8_t * buffer, uint32_t size) { 
    uint16_t crc = 0xFFFF; 

    if (buffer && size) 
     while (size--) 
     { 
      crc = (crc >> 8) | (crc << 8); 
      crc ^= *buffer++; 
      crc ^= ((unsigned char) crc) >> 4; 
      crc ^= crc << 12; 
      crc ^= (crc & 0xFF) << 5; 
     } 

    return crc; 
} 

Şimdi Java eşdeğeri arıyorum. http://introcs.cs.princeton.edu/java/51data/CRC16CCITT.java.html

public class CRC16CCITT { 

    public static void main(String[] args) { 
     int crc = 0xFFFF;   // initial value 
     int polynomial = 0x1021; // 0001 0000 0010 0001 (0, 5, 12) 

     // byte[] testBytes = "123456789".getBytes("ASCII"); 

     byte[] bytes = args[0].getBytes(); 

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

} 

Ama C Kodu bu doesnt iş: Zaten burada iyi bir tane buldum.

C ve Java eşdeğerli bir algoritma için herhangi bir adaptasyon veya çözüm sunabilen var mı? Teşekkür ederiz!

+0

Neden her yineleme üzerinde 'crc =' ayarlıyorsunuz:

Bu benim uygulamasıdır. –

+0

O zaman ne yazmalıyım? crc^=? Kodu sadece birlikte çalıştığım bir açık kaynak projeden kopyaladım. – tellob

+0

CRcs'yi bundan daha hesaplamak için daha hızlı yollar vardır. Aramaya devam et. Tablo güdümlü bir yöntem var. – EJP

cevap

21

Bu durumda java ve c arasındaki en büyük fark, imzasız sayılar kullandığınız ve java'nın yalnızca imzalanmış sayıları olduğu gerçektir. Aynı algoritmayı imzalı numaralarla uygularken, işaret bitinin vardiya işlemleri üzerinde ekstra bir "ve" gerektirmesi gerçeğinin farkında olmanız gerekir. Bu her değer ama geçen görmezden aynıdır olarak

static int crc16(final byte[] buffer) { 
    int crc = 0xFFFF; 

    for (int j = 0; j < buffer.length ; j++) { 
     crc = ((crc >>> 8) | (crc << 8))& 0xffff; 
     crc ^= (buffer[j] & 0xff);//byte to int, trunc sign 
     crc ^= ((crc & 0xff) >> 4); 
     crc ^= (crc << 12) & 0xffff; 
     crc ^= ((crc & 0xFF) << 5) & 0xffff; 
    } 
    crc &= 0xffff; 
    return crc; 

} 
+0

Bu uygulama benim gönderdiğim c koduyla mı? – tellob

+0

Bu, kodumda kullandığım CRC işlevidir - ilk değer aynıysa (0xFFFF) ve polinom aynıdır (0x1021), aynı sonucu vermeleri gerekir. – thedayofcondor

+0

Aldığım paket: 1 20 0 -30 -1 72 -31 -110 64 1 0 2 0 3 0 4 0 5 0 125 -7. 21 bayt. Paketler crc -1667'dir. Son bayt sırasını değiştirmek zorunda kaldım. Algoritma kullandığınızda crc bana 3377 iletir. – tellob