Autor Tema: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32  (Leído 49533 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #15 en: 09 de Mayo de 2009, 15:00:52 »
Hola blackcat!

Cuando uno realiza un CRC en varias etapas, es decir, como por ejemplo en el caso que exponés, el valor de entrada(enter_value en mis algoritmos) es el CRC previo calculado, es decir:

En una trama de 100 bytes, si usas CRC16 deberás primero pactar: El polinomio a utilizar; si se utiliza un valor de entrada inicial distinto de cero y si se utiliza un valor de salida distinto de cero.

Como estamos frente a un CRC16 lo lógico es por ejemplo, tomar de a dos bytes por vez, y someterlos al cálculo del CRC. Supongamos que decido que mi algoritmo utilizará un valor de entrada inicial distinto de cero. Esto quiere decir que, cuando calcule mi primer CRC16(los primeros dos bytes de la trama) haré:

res1= CRC16(byte1byte0, polinomio, 0xFFFF,0x0000)

Fijemonos que aqui le paso los javascript:ChangeEditor(5)argumentos necesarios:
"byte1byte0" serian los primeros 2 bytes de la trama;
el "polinomio" dependería del polinomio elegido(aclaro que mi algoritmo utiliza POLINOMIOS INVERTIDOS(reversed));
"0xFFFF" es un valor con el cual se realizará una XOR con "byte1byte0" al entrar a la rutina del CRC que protegerá a mis bits en caso de que sean ceros.
"0x0000" significa que al terminar de calcular el CRC no modifico el valor obtenido(se realiza la XOR con "byte1byte0" pero no afecta a su valor original);

Como resultado, "res1" contendrá un valor de 16 bits con el CRC calculado, ahora, al calcular el CRC para los próximos dos bytes de la trama, se realizaría así:

res2= CRC16(byte3byte2, polinomio, res1,0x0000)

Si nos fijamos, no solo varian los datos de entrada(que es lógico) sino que además ahora el valor de entrada es el CRC16 calculado previamente("res1"). Esta es la manera en la que se van encadenando los datos y sus respectivos CRC.

Si seguimos con la mísma lógica, los próximos dos bytes de la trama se calcularían...(piensenlo y anotenlo y luego corroboren para ver si me van siguiendo....)
.....
........
................
res3= CRC16(byte5byte4, polinomio, res2,0x0000)

¿Bien?

Entonces, básicamente, el algoritmo del CRC consta de 3 partes importantes:

1)Primero se realiza una XOR entre los datos de entrada y un valor("enter_value" en mi algoritmo);
2)Se realiza el cálculo del CRC del valor obtenido en 1);
3)Se realiza otra XOR entre el valor obtenido en 2) y otro valor("exit_value" en mi algoritmo).


Vamos a verificar si lo que dijo tu profe tiene sentido(aunque yo ya sé la respuesta  :D):

Supongamos una trama de 100 bytes; no entremos en detalles en los valores de los bytes de la trama;supongamos sencillamente que:
"X" representa los 100 bytes de trama
y que el CRC calculado da "C"
Entonces, mi trama estaría compuesta por: "XC"

Método a)

Recibo el paquete "XC" de 102 bytes. Realizo 50 veces(2 bytes por vez) el calculo del CRC16 de la trama "X", y finalmente el CRC que obtengo tiene(o debería tener mejor dicho) un valor "C" si la trama enviada no está corrupta.
Comparo el C obtenido con el C calculado. Son iguales. Perfecto;

Método b)
Recibo el paquete "XC" de 102 bytes. Realizo 50 veces(2 bytes por vez) el calculo del CRC16 de la trama "X", y finalmente el CRC que obtengo tiene(o debería tener mejor dicho) un valor "C" si la trama enviada no está corrupta.
En lugar de compararlo, voy a someter la "C" de la trama recibida con el CRC calculado de la trama "X".

La llamada a la función CRC16 quedaría:

Caso a)

resf= CRC16(C, polinomio, C,0x0000)

La primera "C" corresponde al valor de los dos ultimos bytes de la trama(que sería el CRC recibido), la segunda "C" corresponde al valor CRC final calculado de la trama "X"(porque seguiríamos encandenando los CRCs calculados según lo que expuse más arriba).

Fíjate lo que pasa:

1)Primero se realiza una XOR entre los datos de entrada(C) y un valor(C)("enter_value" en mi algoritmo):
Entonces quedaría C XOR C = 0

2)Se realiza el cálculo del CRC del valor obtenido en 1):
Expongo aquí la LEY DE LA NADA: :mrgreen: :mrgreen:
¿De la nada qué sacamos? ¡NADA! Entonces, si el valor del cual calcular el CRC es 0, el CRC dará 0. Esto sucede con todos los CRC. El resto de 0 es 0. Siempre.
Entonces, el resultado de este paso será 0.
3)Se realiza otra XOR entre el valor obtenido en 2) y otro valor("exit_value" en mi algoritmo):
Realizamos entonces ahora la XOR entre lo calculado previamente(0) y el valor de salida(0x0000). La XOR dará 0.

Entonces, podemos asegurar que la trama está correcta porque el CRC final de los 102 bytes dará 0.

Caso b)

Similar al caso a), sólo que cuando se utiliza un valor de 0xFFF para "exit_value", en el último cálculo del CRC la llamada quedaría:

resf= CRC16(C, polinomio, C,0xFFFF)

1) C XOR C = 0
2)CRC 0 = 0
3) 0 XOR 0xFFFF = 0xFFFF

Por lo que tu profesor tiene razón. Puede dar 0x0000 o 0xFFFFF según los parámetros de salida elegidos.

Saludos.








"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #16 en: 09 de Mayo de 2009, 17:00:30 »
Bruno, te confirmo que el algoritmo esta vez funciona correctamente. Lo aplique sobre las 2 gráficas que puse arriba y salió OK.

Solo un pequeño detalle, en la función hay que declarar long res; en vez de long value;.

Gracias y ojalá te recuperes pronto.  :mrgreen:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #17 en: 09 de Mayo de 2009, 17:56:50 »
ups! Es verdad! Ahora lo corrijo. me alegro que funcione. Gracias por preguntar.

:D
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #18 en: 08 de Noviembre de 2009, 23:00:56 »
Buenas! Estoy tratando de entender como calcular el CRC del protocolo DNP3 y me está ganando  :8} Paso a explicar como se calcula así me dan una mano de como aplicar el código desarrollado por Bruno si es aplicable  :?

El polinomio que se utiliza es:
p(x)=x^16+x^13+x^12+x^11+x^10+x^8+x^6+x^5+x^2+1
y esto equivale a 10011110101100101. Aplicando lo descripto por Bruno en el primer post se llega a que poly=0xA6BC.

Según las especificaciones del protocolo para calcular el CRC debo multiplicar el bloque de datos (de 8 a 128 bits) por 0x10000 (216), el resultado dividirlo en modulo 2 por el polinomio, y el CRC resulta de invertir el resto. Como aplicaría el algoritmo que desarrolla Bruno en este caso  :?:

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #19 en: 09 de Noviembre de 2009, 07:00:29 »
Hola Suky. Si. En teoria cualquier CRC puede ser aplicado a los algoritmos.

En tu caso estás ante un CRC16.

El bloque de datos es siempre multiplo de 8(bits)? O puede que no lo sea necesariamente?.

El CRC que mencionas parece no utilizar valor de entrada, entonces comenzaria con 0x0000(que me parece que iria en lugar del 0x10000 que mencionas). Por lo que comentas el CRC con el que queres trabajar tambien utiliza 0xFFFF por unica vez como valor de salida(porque decis que "el CRC resulta de invertir el resto...").

Cabe destacar que todos los algoritmos que estan presentes aqui utilizan el polinomio reverso(reversed poly).


Realizando algunas pruebas, se ve que rula bien si se eligen bien los parametros:



Código: C
  1. long CRC16(char value, long poly, long init_value, long exit_value){
  2.      long res;
  3.      long i;
  4.  
  5.      res=value;
  6.  
  7.      res^=init_value;
  8.  
  9.      for(i=0;i<8;i++){
  10.          if(res & 1){
  11.              res>>= 1;
  12.              res^=poly;
  13.          }else{
  14.              res>>= 1;
  15.          }
  16.      }
  17.     res^=exit_value;
  18.     return res;
  19. }
  20.  
  21. int main(int argc, char *argv[])
  22. {
  23.     //QCoreApplication a(argc, argv);
  24.     char datos[]="123456789";
  25.     uint i;
  26.     long inival;
  27.  
  28.     inival=0x0000;
  29.     for(i=0;i<strlen(datos);i++){
  30.         inival=CRC16(datos[i],0xA6BC,inival,0x0000);
  31.     }
  32.  
  33.     inival^=0xFFFF;
  34.     printf("El CRC de la cadena: %s es: %X\n",datos,inival);
  35.  
  36.     return a.exec();
  37. }

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado jansuini

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 566
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #20 en: 09 de Noviembre de 2009, 07:49:43 »
Suky
Una consulta:
que estás haciendo en DNP?
Si necesitas algún ensayo de maestro ó esclavo avisame que puedo hacerlo.
Sds
Jorge

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #21 en: 09 de Noviembre de 2009, 09:49:46 »
 :-/ Muchas gracias Bruno, me complique la vida con los valores de entrada y salida, hice varias combinaciones (fuerza bruta porque no logré entender como aplicarlo  :8}) pero no me daba  :mrgreen: Gracias nuevamente!

Suky
Una consulta:
que estás haciendo en DNP?
Si necesitas algún ensayo de maestro ó esclavo avisame que puedo hacerlo.
Sds
Jorge

Por ahora trato de entenderlo! Para luego aplicarlo a un sistema re-conector de alta tensión. Toda la información al respecto me vendría bárbaro!!! :-/


Saludos!
« Última modificación: 09 de Noviembre de 2009, 14:22:45 por Suky »
No contesto mensajes privados, las consultas en el foro

Desconectado jansuini

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 566
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #22 en: 09 de Noviembre de 2009, 13:40:29 »
Suky:
lo que tengo es una rtu con DNP maestro y esclavo ,por eso puedo simularlas .En que provincia estas?
Jorge

Desconectado IngRandall

  • PIC18
  • ****
  • Mensajes: 383
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #23 en: 23 de Septiembre de 2011, 11:32:22 »
todos  los crc tienes que hacerle el espejo al polinomio o es solo si este lo indica?????? saben algo acerca de crc del protocolo bsap de bristol?????

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #24 en: 23 de Septiembre de 2011, 13:14:30 »
El espejo se realiza para poder realizarar el cálculo mediante el método que implemento, nada más.

Desconozco sobre ese protocolo.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #25 en: 15 de Abril de 2014, 23:26:41 »
Bruno, desaparecieron las imagenes al principio del tema :(
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #26 en: 16 de Abril de 2014, 01:52:26 »
Hola Pedro,

sí. Es un problema seguramente del LaTeX que no está funcionando el generador de imágenes y se pierde. Tengo que revisar si puedo repararlo...

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado elotrogonzalo

  • PIC10
  • *
  • Mensajes: 25
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #27 en: 25 de Junio de 2014, 10:06:50 »
Hola BrunoF, podrías subir en un rar las fotos del primer post para poder entender mejor? justo estoy aprendiendo sobre el calculo de crc y me di con que no puedo ver las fotos jeje. Tengo unas dudas al respecto con las rutinas propuestas por que anteriormente estuve viendo esta rutina:

http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html#ga95371c87f25b0a2497d9cba13190847f

uint16_t crc16_update(uint16_t crc, uint8_t a)
    {
        int i;

        crc ^= a;
        for (i = 0; i < 8; ++i)
        {
            if (crc & 1)
                crc = (crc >> 1) ^ 0xA001;
            else
                crc = (crc >> 1);
        }

        return crc;
    }

dudas:

un ejemplo podría ser el siguiente? crc16_update(0xFFFF, undato);

El valor crc inicial hay que pasarle FFFF? la variable "a" de ésta rutina seria el dato a calcularle el crc no?

Yo quiero hacer lo siguiente: tengo una trama de 22 bytes y quiero adjuntarle el crc, entonces

CRC16 = 0xFFFF;

for(i = 0; i < 21; i++)
{
     CRC16 = crc16_update(CRC16, buffer);
}

y luego de ésto obtendría el crc de ésa trama verdad?

Espero puedan corregirme! Saludos.

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 782
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #28 en: 21 de Julio de 2014, 20:16:42 »
Seria bueno armar un pdf con esta información tan valiosa, y mantener el orden que tiene de origen para que no se pierda. saludos
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Algoritmos para calcular CRC5 CRC7 CRC8 CRC16 CRC24 CRC32
« Respuesta #29 en: 21 de Julio de 2014, 21:09:52 »
Hola BrunoF, podrías subir en un rar las fotos del primer post para poder entender mejor? justo estoy aprendiendo sobre el calculo de crc y me di con que no puedo ver las fotos jeje. Tengo unas dudas al respecto con las rutinas propuestas por que anteriormente estuve viendo esta rutina:

http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html#ga95371c87f25b0a2497d9cba13190847f

uint16_t crc16_update(uint16_t crc, uint8_t a)
    {
        int i;

        crc ^= a;
        for (i = 0; i < 8; ++i)
        {
            if (crc & 1)
                crc = (crc >> 1) ^ 0xA001;
            else
                crc = (crc >> 1);
        }

        return crc;
    }

dudas:

un ejemplo podría ser el siguiente? crc16_update(0xFFFF, undato);

El valor crc inicial hay que pasarle FFFF? la variable "a" de ésta rutina seria el dato a calcularle el crc no?

Yo quiero hacer lo siguiente: tengo una trama de 22 bytes y quiero adjuntarle el crc, entonces

CRC16 = 0xFFFF;

for(i = 0; i < 21; i++)
{
     CRC16 = crc16_update(CRC16, buffer);
}

y luego de ésto obtendría el crc de ésa trama verdad?

Espero puedan corregirme! Saludos.

Hola, perdoná la demora. Sí, si el algoritmo que usan invierte el valor de entrada, entonces sería correcto. Igualmente a veces no lo invierten. Depende de la implementación. Por lo general, se invierte por única vez al ingresar al procesamiento de una trama.

Voy a intentar ver lo de las imágenes. En realidad es un fallo del generador del LaTEX. Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything