CRC32教程 個人理解

2021-10-06 18:41:51 字數 2122 閱讀 5420

我用的是直接計算法,非查表法。直接計算更符合我的專案要求,我是使用在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 用來校驗檔案是否出...