#include #define MAX_DATA_LEN 256 int fixCRC (unsigned char *buf, int len, unsigned char crc, int startBit, int maxErrors); unsigned char calcCRC (unsigned char *buf, int len); int main (int argc, char *argv[]) { unsigned char crc, data[MAX_DATA_LEN]; unsigned int byte; int i, len; if (argc < 3) { printf ("Expected: fix data CRC\n"); return 0; } for (i = 0; argv[1][2 * i] != '\0'; i++) { sscanf (argv[1] + 2 * i, "%02X", &byte); data[i] = byte; } len = i; sscanf (argv[2], "%02X", &byte); crc = byte; for (i = 0; i < 8 * (len + 1); i++) { if ( fixCRC(data, len, crc, 0, i) ) { printf ("Errors corrected: %d\n", i); return 0; } } return 0; } int fixCRC (unsigned char *buf, int len, unsigned char crc, int startBit, int maxErrors) { int fixed, i; if (maxErrors == 0) { if ( crc == calcCRC(buf, len) ) { for (i = 0; i < len; i++) { printf ("%02X", buf[i]); } printf (" %02X\n", crc); return 1; } else { return 0; } } fixed = 0; for (i = startBit; i < 8 * len; i++) { buf[i / 8] ^= (1 << (i % 8)); fixed |= fixCRC(buf, len, crc, i + 1, maxErrors - 1); buf[i / 8] ^= (1 << (i % 8)); } for (; i < 8 * (len + 1); i++) { crc ^= (1 << (i % 8)); fixed |= fixCRC(buf, len, crc, i + 1, maxErrors - 1); crc ^= (1 << (i % 8)); } return fixed; } unsigned char calcCRC (unsigned char *buf, int len) { unsigned int crc, inputBit; int i, j; crc = 0; for (i = 0; i < len; i++) { for (j = 0; j < 8; j++) { inputBit = ( (buf[i] & (1 << j)) != 0 ); inputBit ^= (crc & 1); crc >>= 1; if (inputBit) { crc ^= 0x8C; } } } return crc; }