2016-04-02 12 views
1

Aşağıdaki koduNasıl iyi CRC16 java dizesinden alınır? masanın altına kadar sonucu doğrulamak için

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; 

} 

kullanan Android uygulamasında dizesinden CRC16 almaya çalışıyorum ve bazı veriler var

expected result

ben A geçirerek Bu işlev, kötü CRC ve hepsi için aynı olan B915 alıyorum. Tabloda belirtildiği gibi neden iyi CRC alamıyorum. lütfen beni nerede yanlış yapıyorum? Teşekkürler!

cevap

0

Bad_CRC alıyorsunuz, Bad_CRC hesaplamasını 0xFFFF kullanarak hesaplıyorsunuz. Good_CRC hesaplamak istiyorsanız, 0x1D0F ile değiştirin.

public static void main(String[] args) { 
    String input = "A"; 
    Integer crcRes = crc16(input.getBytes()); 
    System.out.println("Calculated CRC-CCITT: 0x" + Integer.toHexString(crcRes)); 
} 

private static int crc16(final byte[] buffer) { 
    /* Note the change here */ 
    int crc = 0x1D0F; 
    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; 
} 

Çıktı:

Calculated CRC-CCITT: 0x9479 
+2

Çok teşekkürler Burada enter image description here

kod parçacığı olduğunu! Onun çözüldü. –

+0

Hoş Geldiniz! :) – user2004685

+0

Hayır. Bu sadece bir bandaid. CCIT CRC-16, başlangıç ​​değeri 0xffff olarak tanımlanmıştır. Ortak kullanımdaki tek diğer başlangıç ​​değeri sıfırdır. Kodunuzdaki hatayı bulun ve düzeltin. Tablodaki bir algoritma da dahil olmak üzere, sekiz kat daha hızlı, – EJP