2012-09-11 32 views
5

Tengo problemas para calcular la implementación CRC-16 de una matriz de bytes en java. Básicamente, estoy tratando de enviar bytes a una RFID que comienza a escribir en una etiqueta. Puedo ver el valor de la suma de comprobación de la matriz mirando el comando tcpdump en mac. Pero mi objetivo es generarlo solo. Aquí está mi matriz de bytes que deben generar 0xBE, 0xd9:crc16 implementation 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 es el encabezado. Como dice la documentación, será excluido.

Cada vez que pruebo esta matriz en java (con 0xbe, 0xd9), funciona la RFID. Mi problema es la generación de esos valores de suma de comprobación. Busqué en casi toda la web pero no tuve oportunidad. No pude encontrar ningún algoritmo que produzca 0xbe, 0xd9.

Cualquier idea es bienvenida para mí. Gracias por adelantado.

edición: here is the protocol que dotado de RFID

Respuesta

2

estoy no muy seguro de si esto es la traducción correcta en Java de la C Algoritmo crc16 .... ¡pero muestra el resultado correcto para su ejemplo!

Compare otros resultados con el CRC16 de Mac y realice una prueba de esfuerzo antes de utilizarlo.

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

No sé cómo agradecerte. Muy acertado. Pero no puedo evitar preguntar, ¿cuál ves como el problema entre esos dos? –

0

Tal vez ¿Está buscando para esto?

Crc16 in java

Puedo usar el mismo array ("mesa" variable) en este método:

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

    } 

    return (int) crc; 
} 
+0

Muchas gracias por su respuesta. Ya lo he intentado, pero no hay oportunidad. No me da 0xbe 0xd9 bytes. –

+0

Estoy leyendo la documentación. Trataré de implementar el algoritmo en el Apéndice A en Java (¿ya has intentado hacerlo?) –

+0

, de hecho, no tengo mucha información sobre c. básicamente no lo convertí a Java. pero creo que es la misma implementación que su publicación. Solo copié los bytes de la tabla de búsqueda del apéndice ay los intenté con eso. y otra vez sin éxito Estoy al final de un proyecto. para lograrlo, ese es mi último paso. –

0

Hay una aplicación CRC16 en el tiempo de ejecución de Java (rt.jar) ya.

Consulte grepcode para la fuente.

Usted probablemente será capaz de verlo en su IDE si la búsqueda de CRC16:

picture of class search for CRC16

Cuestiones relacionadas