2006 07 28 11 48 CRC的學習筆記

下面是用來計算CRC table的,
因為是一次運算8個bits,
所以一開始拿出高位8個bits,
每次會shift出一個bits,用來計算這一次是否要作除法。
(因為在做CRC運算時,Xor是可以等同加減法。)
所以建出這個table是事先把所有的值都先算出來。
等要用時,只需要shift出8個bits,尋找相對應的值,
就不需要真的去計算。

uint32_t cm_tab (p_cm,index)
p_cm_t p_cm;
int index;
{
int i;
uint32_t r;
uint32_t topbit = BITMASK(p_cm->cm_width-1);
uint32_t inbyte = (ulong) index;

if (p_cm->cm_refin) inbyte = reflect(inbyte,8);
r = inbyte << (p_cm->cm_width-8);
for (i=0; i<8; i++)
if (r & topbit)
r = (r << 1) ^ p_cm->cm_poly;
else
r<<=1;
if (p_cm->cm_refin) r = reflect(r,p_cm->cm_width);
return r & widmask(p_cm);
}

而底下這個較常見的則是反過來計算,
(Poly值 0xedb88320 也是倒過來的)

static void InitCRC(void)
{
int i,j;
uint32_t c;

for(i = 0;i < 256;i++) {
for(c = i,j = 0;j < 8;j++)
c = (c & 1) ? (c>>1)^0xedb88320L : (c>>1);
cr3tab[i] = c;
}
}

用table來算CRC有兩種算法,也是用同個table,去算出crc值的。
但是算出來的CRC值不太一樣(剛好順序顛倒),如下:
1. crc = crctable[((crc>>24) ^ *blk_adr++) & 0xFFL] ^ (crc << 8);
2. crc = crctable[(crc ^ *blk_adr++) & 0xFFL] ^ (crc >> 8));
第一種是正常情況,第二種是reflected(反射型?).

參考資料 http://www.ross.net/crc/download/crc_v3.txt