2012-09-11 15 views
5

Ho problemi con il calcolo dell'implementazione CRC-16 di un array di byte in java. Fondamentalmente sto cercando di inviare byte a un RFID che inizia a scrivere su un tag. Posso vedere il valore di checksum dell'array guardando il comando tcpdump su mac. Ma il mio obiettivo è generarlo da solo. Ecco il mio array di byte che dovrebbe generare 0xBE, 0xd9:implementazione crc16 java

byte[] bytes = new byte[]{(byte) 0x55,(byte) 0x08,(byte) 0x68, (byte) 0x14, 
          (byte) 0x93, (byte) 0x01, (byte) 0x00, (byte) 0x00, 
          (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, 
          (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, 
          (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, 
          (byte) 0x00, (byte) 0x22, (byte) 0x09, (byte) 0x11}; 

0x55 è l'intestazione. Come dice la documentazione, sarà escluso.

Ogni volta che provo questa matrice su Java (con 0xBE, 0xd9), RFID funziona. Il mio problema è la generazione di quei valori di checksum. Ho cercato quasi tutto il web ma nessuna possibilità. Non sono riuscito a trovare alcun algoritmo che produca 0xbe, 0xd9.

Qualsiasi idea è più gradita per me. Grazie in anticipo.

edit: here is the protocol che ha fornito con la tecnologia RFID

risposta

2

Sono non veramente sicuro se questa è la traduzione corretta in Java della C algoritmo crc16 .... ma mostra il risultato corretto per il tuo esempio!

Si prega di confrontare altri risultati con il CRC16 di Mac e di sottoporlo a prova di stress prima di usarlo..

public class Crc16 { 
public static void main(String... a) { 
    byte[] bytes = new byte[] { (byte) 0x08, (byte) 0x68, (byte) 0x14, (byte) 0x93, (byte) 0x01, (byte) 0x00, 
      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x06, (byte) 0x00, (byte) 0x00, (byte) 0x01, 
      (byte) 0x00, (byte) 0x13, (byte) 0x50, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x22, (byte) 0x09, 
      (byte) 0x11 }; 
    byte[] byteStr = new byte[4]; 
    Integer crcRes = new Crc16().calculate_crc(bytes); 
    System.out.println(Integer.toHexString(crcRes)); 

    byteStr[0] = (byte) ((crcRes & 0x000000ff)); 
    byteStr[1] = (byte) ((crcRes & 0x0000ff00) >>> 8); 

    System.out.printf("%02X\n%02X", byteStr[0],byteStr[1]); 
} 

int calculate_crc(byte[] bytes) { 
    int i; 
    int crc_value = 0; 
    for (int len = 0; len < bytes.length; len++) { 
     for (i = 0x80; i != 0; i >>= 1) { 
      if ((crc_value & 0x8000) != 0) { 
       crc_value = (crc_value << 1)^0x8005; 
      } else { 
       crc_value = crc_value << 1; 
      } 
      if ((bytes[len] & i) != 0) { 
       crc_value ^= 0x8005; 
      } 
     } 
    } 
    return crc_value; 
} 

} 
+0

Non so come ringraziarvi. Grandemente appagato. Ma non posso trattenermi dal chiedere, cosa vedi come il problema tra questi due? –

0

Forse stai cercando questo?

Crc16 in java

io uso lo stesso array ("tavolo" variabile) in questo metodo:

public Integer computeCrc16(byte[] data) { 
    int crc = 0x0000; 
    for (byte b : data) { 
     crc = (crc >>> 8)^table[((crc^b) & 0xff)]; 

    } 

    return (int) crc; 
} 
+0

Grazie mille per la risposta. L'ho già provato, ma nessuna possibilità. Non mi dà 0xbe 0xd9 byte. –

+0

Sto leggendo la documentazione. Proverò a implementare l'algoritmo sull'Appendice A in Java (hai già provato a farlo?) –

+0

beh, in realtà non ho così tante informazioni su c. in pratica non l'ho convertito in java. ma penso che sia la stessa implementazione del tuo post. Ho copiato solo l'appendice a della tabella di ricerca in byte e ho provato con quello. e ancora nessun successo. Sono alla fine di un progetto. per raggiungerlo, questo è il mio ultimo passo. –

0

C'è un'implementazione CRC16 nel runtime Java (rt.jar) già.

Vedere grepcode per la fonte.

Si sarà probabilmente in grado di vedere nel vostro IDE se si cerca CRC16:

picture of class search for CRC16