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