Sé que la intención total del uso de CRC es la detección de errores, pero escuché a alguien decir que se puede usar para corregir errores básicos además de la detección de errores. Tenía curiosidad si este era el caso, y si es así, ¿qué tan poderoso es? Quiero decir, generalmente nos referimos a CRC como capaz de realizar la detección de x bits, pero tengo curiosidad si es capaz de realizar la corrección de x bits. Si es así, ¿cómo funciona esto? Gracias.¿Es posible hacer una corrección de errores rudimentaria con CRC?
Respuesta
Es posible hacer la corrección de errores de un solo bit con un CRC. Supongamos una tiene un CRC "registro" y tiene funciones para ejecutar el algoritmo CRC hacia adelante y hacia atrás un poco a la vez, haciendo caso omiso de datos entrantes
int crc_forward(int old_value, int data_bit) { if (old_value & 0x8000) return ((old_value^0x8000) SHL 1)^0x1021^data_bit; else return (old_value SHL 1)^data_bit; } int crc_reverse(int old_value) { if (old_value & 1) return (old_value SHR 1)^0x8810; else return old_value SHR 1; }
supongamos que tiene un paquete que se calcula de manera que la inicialización de la CRC en cierta el valor y ejecutando crc_forward para cada bit (MSB primero) debería dar como resultado cero. Si se obtiene un valor de CRC distinto de cero, se puede ejecutar el algoritmo en reversa (ignorando los bits de datos) hasta que el valor de CRC calculado sea 1. Esa es la ubicación del bit incorrecto.
Tenga en cuenta que este enfoque puede ser adecuado para la corrección de errores de software en cosas como flash NAND. Para usarlo de forma útil para la corrección de errores de hardware, uno debería poder retrasar las operaciones de lectura hasta que se pueda procesar el ECC, o de lo contrario se necesitaría una tabla de valores de 'síndrome' y posiciones de bit.
Recientemente trabajé en la detección de errores CRC16 y la corrección de errores de un solo bit.
Aquí es la idea básica:
- Suponga que tiene un solo bit de error.
- Si los datos + crc no incluyen ningún error, el CRC será 0, de lo contrario no lo es.
- Definimos el CRC enviado como CRC y CRC recibido como CRCr.
- Luego los bits de error están dados por
CRCox = CRCs^CRCr
. - El resultado abarca errores CRC y errores de datos.
- Tenga en cuenta qué relación existe entre CRCox y el error de bit.
¿Esto es claro? Tengo un trabajo sobre esto. Si quieres saber más, házmelo saber.
PUEDE hacer la corrección de errores de múltiples bits con CRC. Al mirar wikipedia, con referencias al trabajo de koopmans, un CRC puede detectar sus errores hamming_distance-1. La distancia de Hamming depende de la longitud de la carga útil y del polinomio de CRC en uso. Entonces, por ejemplo, el polinomio de Koopman de 0xBA0DC66B puede detectar hasta 5 bits de error en mensajes de hasta 16360 bits de longitud. El algoritmo descrito en los dos mensajes anteriores puede extenderse hasta tantos bits como sea necesario, pero el tiempo aumenta exponencialmente con la cantidad de bits que se deben corregir.
- Calcular error CRC = CRC_gotten^CRC_expected.
- Mire todos los mensajes de 1 bit posibles (es decir, todos 0, a 1 y todos 0) (hay casos de longitud de mensaje a evaluar. Observe que BITS no BYTES) y el error es el mensaje que genera el error CRC.
- Invierte el bit detectado para corregir el error.
Si no puede encontrar 1 bit que coincida con el error CRC, mire todo 2 bit, 3 bits hasta su hamming_distance-1.Tenga en cuenta que esto se vuelve lento rápidamente, message_length squared para 2 bits, en cubos para 3 bits hasta la quinta potencia para cinco bits.
El algoritmo indicado como está redactado parecería tener n cuadrado para errores de un solo bit, n-cubo para errores de dos bits, etc. calcular el CRC para cada mensaje de forma independiente tomaría tiempo N. Sería útil sugerir cómo se podría hacer sin ese factor adicional de N. – supercat
No, N para bits individuales. Puedo calcular el CRC de un solo bit establecido en N bits en el tiempo logN. Mejor, dado el CRC de un solo bit en la posición X en un mensaje de N bits, puedo decirle el CRC del mensaje con un bit en N + 1 trivialmente. Eso es solo un paso del bucle interno de CRC. – ilgitano
solo su función crc_forward en un bucle: comenzando desde 1, crc_forward, ¿es ese el error crc? no, crc_froward y revisa nuevamente. – ilgitano
- 1. Algoritmos de corrección de errores OCR
- 2. Corrección de errores hacia adelante en .NET
- 3. Corrección de errores en una rama de características
- 4. Eficacia de detección de errores (CRC, suma de comprobación, etc.)
- 5. ¿Es posible hacer una reducción en una matriz con openmp?
- 6. ¿Es posible atrapar errores de CORS?
- 7. Mejores prácticas para control de fuente y corrección de errores
- 8. Java: biblioteca ECC (código de corrección de errores)?
- 9. Android: ¿Es posible hacer una copia de una Vista?
- 10. control de versiones: moviendo una corrección de errores/mejora del código en el desarrollo de características
- 11. ¿Cómo puedo ver si una rama contiene una corrección de errores en Perforce?
- 12. ¿Cómo determinar qué CRC usar?
- 13. ¿Es posible convertir una SoapException en una FaultException con WCF?
- 14. ¿Es posible tener errores de registro de raíles al sembrar
- 15. ¿es posible hacer una barra de calificación fija?
- 16. Jquery $ .post() - ¿Es posible hacer una solicitud de página completa?
- 17. Cómo usar boost :: crc?
- 18. CRC comprueba los archivos
- 19. ¿Es posible hacer una automatización de consola Firebug?
- 20. ¿Es posible hacer una solicitud JSONP de HTTPS a HTTP?
- 21. ¿Es posible hacer una inicialización estática de mutexes en Windows?
- 22. ¿Es posible hacer obligatorio el valor de una anotación Java?
- 23. CRC preestablecido y residuo
- 24. ¿Es posible hacer solicitudes http reales con robolectric
- 25. ¿Es posible hacer GUI sexy con javaFX y swing?
- 26. ¿Es posible hacer lo siguiente con auto en C++ 0x?
- 27. ¿Es posible hacer extensiones a python/php/perl con Go?
- 28. ¿Es posible hacer pseudo-streaming Flash con S3?
- 29. ¿Es posible hacer matemáticas dentro de CSS?
- 30. Cálculo del divisor CRC
Creo que este ** puede ** ser el documento @Wandy se refiere a: http://espace.library.uq.edu.au/eserv.php?pid=UQ:9523&dsID=n01393289.pdf –
Para point 2, no es el CRC lo que será 0. ¡Es el CRC recibido XORed con el CRC calulado en los datos recibidos! –
@ Étienne ciertamente quería decir que el CRC de los datos recibidos + crc sería cero –