Correcting 2 bit errors with CRCs
1 and 2 bit errors can easily be corrected by using the following code snippet, a complete example is available too.
unsigned int i,v=1; for(i=0; i<block_size ; i++){ crctab[i][0]= i ? (v^1) : v; crctab[i][1]= i; v= (v<<1) ^ (G & (((int)v)>>31)); } qsort(crctab, BLOCK_SIZE, 2*sizeof(int), cmp); static int get_error(unsigned int crc, unsigned int len, int error[2]){ int i; for(i=0; i<len ; i++){ int *result= bsearch(&crc, crctab, BLOCK_SIZE, 2*sizeof(int), cmp); if(result){ error[0]= i; error[1]= result[1] + i; return 1 + (result != crctab[0]); } crc= (crc>>1) ^ (((G>>1)|0x80000000) & (-(crc&1))); } return -1; }
Note, if you want to use this in anything where speed matters, then you should replace the qsort/bsearch with some hash table, i didnt as the c stadard doesnt contain any useable hashtable implementation and i was lazy