我用的是直接計算法,非查表法。直接計算更符合我的專案要求,我是使用在stm32微控制器上的用的是keil。按道理說跟平台無關,整個用的是c語言編寫。在網上也有很多對crc的講解,我這裡就不班門弄斧了,我也是剛學的,很多**教程都很詳細的講解了crc的原理和方法,但是比較少有乙個總的總結,在這裡我只寫我的實現過程,或許能幫到剛學習的朋友,順便記錄一下。
這裡推薦乙個挺不錯的講解**看完**的講解,再看剩下的流程就明白了。
crc32為例詳細解析(菜鳥至老鳥高階)
需要計算的資料:data
poly:多項式
init:初始值
xorout :結果異或值
這是是針對的每個位元組,而不是整個資料,然後賦回給data
例如:00101011,10110100,00100101,10000011
倒置:11010100,00101101,10100100,11000001
(一般是0xffffffff,或者0x00000000,也可以自定義)
判斷data最高位為1還是0,
1:data = data^poly
0:不處理
然後data左移一位再重複執行步驟3,直到得到乙個等於或小於 多項式(其實就是按照資料長度一般都是移多少次,8bit:8次,32bit:32次)
data = data ^ 結果異或值 xorout (一般是0xffffffff,或者0x00000000,也可以自定義)
這個是倒置整個資料。
例如:00101011,10110100,00100101,10000011
倒置:11000001,10100100,00101101,11010100
這裡附上幾個crc校驗的**:
步驟計算結果:
功 能:倒置資料 :例如10110010,倒置後:01001101
參 數:datar:需倒置的資料
dlen:倒置資料的長度 8/16/32
返回值:倒置後的資料
*/unsigned int zrcr_bitreverse(unsigned int datar,unsigned char dlen) //倒序資料 8/16/32
return rvalue;
}
/*
功 能:計算crc32的值
參 數:*data:需計算的資料
len:資料個數
返回值:crc32的值
*/unsinged int zcrc_value;
unsigned int zcrc_getcrc(unsigned char *data,unsigned int len,unsigned char repeat)
else
zcrc_value <<=1;
}len--;
}return zrcr_bitreverse(zcrc_value^0xffffffff,32);
}
unsinged int zcrc_value;
unsigned int zcrc_getcrc(unsigned int *data,unsigned int len,unsigned char repeat)
data++;
//2、資料與初始值求或
zcrc_state.zcrc_value ^= value_temp;
for(i=0;i<32;i++)
else
zcrc_value <<=1;
}len--;
}return zrcr_bitreverse(zcrc_value^0xffffffff,32);
}
CRC32學習總結
這幾天一直在研究crc相關的知識,本來通訊網學習過相關的知識,但是比較淺。通過這幾天的尤其是今天的學習,我對於crc有了全新的認識。課本上主要著重介紹直接計算法,就是資料補零再和生成多項式做除法。這種方法利用迴圈來實現是比較容易的,但是在fpga中,想要利用硬體的併發性來實現crc的計算。最近一直在...
CRC32演算法實現
crc32 檢錯能力極強,開銷小,易於用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的機率僅為0.0047 以下。從效能上和開銷上考慮,均遠遠優於奇偶校驗及算術和校驗等方式。因而,在資料儲存和資料通訊領域,crc無處不在 著名的通訊協議x.25的fcs 幀檢錯序列 採用的是crc cc...
CRC32爆破小結
最近在bugku遇到了一道隱寫題,binwalk之後發現裡面有很多個壓縮包。然後就無從下手,於是檢視別人大佬的wp才發現是crc32爆破,由於本人第一次遇到這種題目,就記錄一下吧。crc想必大家都知道,它的全稱是迴圈冗餘校驗 cyclic redundancy check,crc 用來校驗檔案是否出...