crc32演算法
⑴ CRC32的計算方法
CRC的本質是模-2除法的余數,採用的除數不同,CRC的類型也就不一樣。通常,CRC的除數用生成多項式來表示。 最常用的CRC碼及生成多項式名稱生成多項式。
CRC-12:
(1)crc32演算法擴展閱讀
通常的CRC演算法在計算一個數據段的CRC值時,其CRC值是由求解每個數值的CRC值的和對CRC寄存器的值反復更新而得到的。這樣,求解CRC的速度較慢。通過對CRC演算法的研究,我們發現:一個8位數據加到16位累加器中去,只有累加器的高8位或低8位與數據相作用,其結果僅有256種可能的組合值。
因而,我們可以用查表法來代替反復的運算,這也同樣適用於CRC32的計算。本文所提供的程序庫中,函數crchware是一般的16位CRC的演算法。mk-crctbl用以在內存中建立一個CRC數值表。
⑵ 有多種CRC(CRC32也有多種,包括CRC-32-IEEE 802.3),計算出的值不同嗎與碼表有關系還是演算法
CRC模式都是一樣的,本質上都是大整數二進制除法。
碼表不同是由於提供的poly不一樣,所以算出來的結果也不同
比如x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
對應的poly就是0xEDB88320
所以基本用這種方程式來表達CRC的種類
⑶ crc32演算法原理
一、循環冗餘碼校驗英文名稱為Cyclical Rendancy Check,簡稱CRC.
它是利用除法及余數的原理來作錯誤偵測(Error Detecting)的.實際應用時,發送裝置計算出CRC值並隨數據一同發送給接收裝置,接收裝置對收到的數據重新計算CRC並與收到的CRC相比較,若兩個CRC值不同,則說明數據通訊出現錯誤.
根據應用環境與習慣的不同,CRC又可分為以下幾種標准:
①CRC-12碼;
②CRC-16碼;
③CRC-CCITT碼;
④CRC-32碼.
CRC-12碼通常用來傳送6-bit字元串.
CRC-16及CRC-CCITT碼則用是來傳送8-bit字元,其中CRC-16為美國採用,而CRC-CCITT為歐洲國家所採用.
CRC-32碼大都被採用在一種稱為Point-to-Point的同步傳輸中.
下面以最常用的CRC-16為例來說明其生成過程.
CRC-16碼由兩個位元組構成,在開始時CRC寄存器的每一位都預置為1,然後把CRC寄存器與8-bit的數據進行異或(異或:二進制運算 相同為0,不同為1;0^0=0;0^1=1;1^0=1;1^1=0),
之後對CRC寄存器從高到低進行移位,在最高位(MSB)的位置補零,而最低位(LSB,移位後已經被移出CRC寄存器)如果為1,則把寄存器與預定義的多項式碼進行異或,否則如果LSB為零,則無需進行異或.重復上述的由高至低的移位8次,第一個8-bit數據處理完畢,用此時CRC寄存器的值與下一個8-bit數據異或並進行如前一個數據似的8次移位.所有的字元處理完成後CRC寄存器內的值即為最終的CRC值.
下面為CRC的計算過程:
1.設置CRC寄存器,並給其賦值FFFF(hex).
2.將數據的第一個8-bit字元與16位CRC寄存器的低8位進行異或,並把結果存入CRC寄存器.
3.CRC寄存器向右移一位,MSB補零,移出並檢查LSB.
4.如果LSB為0,重復第三步;若LSB為1,CRC寄存器與多項式碼相異或.
5.重復第3與第4步直到8次移位全部完成.此時一個8-bit數據處理完畢.
6.重復第2至第5步直到所有數據全部處理完成.
7.最終CRC寄存器的內容即為CRC值.
常用的CRC循環冗餘校驗標准多項式如下:
CRC(16位) = X16+X15+X2+1
CRC(CCITT) = X16+X12 +X5+1
CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1
以CRC(16位)多項式為例,其對應校驗二進制位列為1 1000 0000 0000 0101.
注意:這兒列出的標准校驗多項式都含有(X+1)的多項式因子;各多項式的系數均為二進制數,所涉及的四則運算仍遵循對二取模的運算規則.
(註:對二取模的四則運算指參與運算的兩個二進制數各位之間凡涉及加減運算時均進行XOR異或運算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1,0 XOR 1=1,即相同為0,不同為1)
⑷ 什麼是CRC32校驗
CRC32演算法學習筆記以及如何用java實現
CRC32演算法學習筆記以及如何用java實現
一:說明
論壇上關於CRC32校驗演算法的詳細介紹不多。前幾天偶爾看到Ross N. Williams的文章,總算把CRC32演算法的來龍去脈搞清楚了。本來想把原文翻譯出來,但是時間參促,只好把自己的一些學習心得寫出。這樣大家可以更快的了解CRC32的主要思想。由於水平有限,還懇請大家指正。原文可以訪問:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。
二:基本概念及相關介紹
2.1 什麼是CRC
在遠距離數據通信中,為確保高效而無差錯地傳送數據,必須對數據進行校驗即差錯控制。循環冗餘校驗CRC(Cyclic Rendancy Check/Code)是對一個傳送數據塊進行校驗,是一種高效的差錯控制方法。
CRC校驗採用多項式編碼方法。多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,如同邏輯異或運算。
2.2 CRC的運算規則
CRC加法運算規則:0+0=0
0+1=1
1+0=1
1+1=0 (注意:沒有進位)
CRC減法運算規則:
0-0=0
0-1=1
1-0=1
1-1=0
CRC乘法運算規則:
0*0=0
0*1=0
1*0=0
1*1=1
CRC除法運算規則:
1100001010 (注意:我們並不關心商是多少。)
_______________
10011 ) 11010110110000
10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = 余數
2.3 如何生成CRC校驗碼
(1) 設G(X)為W階,在數據塊末尾添加W個0,使數據塊為M+ W位,則相應的多項式為XrM(X);
(2) 以2為模,用對應於G(X)的位串去除對應於XrM(X)的位串,求得余數位串;
(3) 以2為模,從對應於XrM(X)的位串中減去余數位串,結果就是為數據塊生成的帶足夠校驗信息的CRC校驗碼位串。
2.4 可能我們會問那如何選擇G(x)
可以說選擇G(x)不是一件很容易的事。一般我們都使用已經被大量的數據,時間檢驗過的,正確的,高效的,生成多項式。一般有以下這些:
16 bits: (16,12,5,0) [X25 standard]
(16,15,2,0) ["CRC-16"]
32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]
三: 如何用軟體實現CRC演算法
現在我們主要問題就是如何實現CRC校驗,編碼和解碼。用硬體實現目前是不可能的,我們主要考慮用軟體實現的方法。
以下是對作者的原文的翻譯:
我們假設有一個4 bits的寄存器,通過反復的移位和進行CRC的除法,最終該寄存器中的值就是我們所要求的余數。
3 2 1 0 Bits
+---+---+---+---+
Pop <-- | | | | | <----- Augmented message(已加0擴張的原始數據)
+---+---+---+---+
1 0 1 1 1 = The Poly
(注意: The augmented message is the message followed by W zero bits.)
依據這個模型,我們得到了一個最最簡單的演算法:
把register中的值置0.
把原始的數據後添加r個0.
While (還有剩餘沒有處理的數據)
Begin
把register中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。
If (如果上一步的左移操作中的移出的一位是1)
register = register XOR Poly.
End
現在的register中的值就是我們要求的crc余數。
我的學習筆記:
可為什麼要這樣作呢?我們從下面的實例來說明:
1100001010
_______________
10011 ) 11010110110000
10011,,.,,....
-----,,.,,....
-》 10011,.,,....
10011,.,,....
-----,.,,....
-》 00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
我們知道G(x)的最高位一定是1,而商1還是商0是由被除數的最高位決定的。而我們並不關心商究竟是多少,我們關心的是余數。例如上例中的G(x)有5位。我們可以看到每一步作除法運算所得的余數其實就是被除數的最高位後的四位於G(x)的後四位XOR而得到的。那被除數的最高位有什麼用呢?我們從打記號的兩個不同的余數就知道原因了。當被除數的最高位是1時,商1然後把最高位以後的四位於G(x)的後四位XOR得到余數;如果最高位是0,商0然後把被除數的最高位以後的四位於G(x)的後四位XOR得到余數,而我們發現其實這個余數就是原來被除數最高位以後的四位的值。也就是說如果最高位是0就不需要作XOR的運算了。到這我們總算知道了為什麼先前要這樣建立模型,而演算法的原理也就清楚了。
以下是對作者的原文的翻譯:
可是這樣實現的演算法卻是非常的低效。為了加快它的速度,我們使它一次能處理大於4 bit的數據。也就是我們想要實現的32 bit的CRC校驗。我們還是假設有和原來一樣的一個4 "bit"的register。不過它的每一位是一個8 bit的位元組。
3 2 1 0 Bytes
+----+----+----+----+
Pop <-- | | | | | <----- Augmented message
+----+----+----+----+
1<------32 bits------> (暗含了一個最高位的「1」)
根據同樣的原理我們可以得到如下的演算法:
While (還有剩餘沒有處理的數據)
Begin
檢查register頭位元組,並取得它的值
求不同偏移處多項式的和
register左移一個位元組,最右處存入新讀入的一個位元組
把register的值和多項式的和進行XOR運算
End
我的學習筆記:
可是為什麼要這樣作呢? 同樣我們還是以一個簡單的例子說明問題:
假設有這樣的一些值:
當前register中的值: 01001101
4 bit應該被移出的值:1011
生成多項式為: 101011100
Top Register
---- --------
1011 01001101
1010 11100 + (CRC XOR)
-------------
0001 10101101
首4 bits 不為0說明沒有除盡,要繼續除:
0001 10101101
1 01011100 + (CRC XOR)
-------------
0000 11110001
^^^^
首4 bits 全0說明不用繼續除了。
那按照演算法的意思作又會有什麼樣的結果呢?
1010 11100
1 01011100+
-------------
1011 10111100
1011 10111100
1011 01001101+
-------------
0000 11110001
現在我們看到了這樣一個事實,那就是這樣作的結果和上面的結果是一致的。這也說明了演算法中為什麼要先把多項式的值按不同的偏移值求和,然後在和register進行異或運算的原因了。另外我們也可以看到,每一個頭位元組對應一個值。比如上例中:1011,對應01001101。那麼對於32 bits 的CRC 頭位元組,依據我們的模型。頭8 bit就該有 2^8個,即有256個值與它對應。於是我們可以預先建立一個表然後,編碼時只要取出輸入數據的頭一個位元組然後從表中查找對應的值即可。這樣就可以大大提高編碼的速度了。
+----+----+----+----+
+-----< | | | | | <----- Augmented message
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+-----> +----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+
以下是對作者的原文的翻譯:
上面的演算法可以進一步優化為:
1:register左移一個位元組,從原始數據中讀入一個新的位元組.
2:利用剛從register移出的位元組作為下標定位 table 中的一個32位的值
3:把這個值XOR到register中。
4:如果還有未處理的數據則回到第一步繼續執行。
用C可以寫成這樣:
r=0;
while (len--)
r = ((r << 8) | p*++) ^ t[(r >> 24) & 0xFF];
可是這一演算法是針對已經用0擴展了的原始數據而言的。所以最後還要加入這樣的一個循環,把W個0加入原始數據。
我的學習筆記:
注意不是在預處理時先加入W個0,而是在上面演算法描述的循環後加入這樣的處理。
for (i=0; i<W/4; i++)
r = (r << 8) ^ t[(r >> 24) & 0xFF];
所以是W/4是因為若有W個0,因為我們以位元組(8位)為單位的,所以是W/4個0 位元組。注意不是循環w/8次
以下是對作者的原文的翻譯:
1:對於尾部的w/4個0位元組,事實上它們的作用只是確保所有的原始數據都已被送入register,並且被演算法處理。
2:如果register中的初始值是0,那麼開始的4次循環,作用只是把原始數據的頭4個位元組送入寄存器。(這要結合table表的生成來看)。就算register的初始值不是0,開始的4次循環也只是把原始數據的頭4個位元組把它們和register的一些常量XOR,然後送入register中。
3:(A xor B) xor C = A xor (B xor C)
總上所述,原來的演算法可以改為:
+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+
演算法:
1:register左移一個位元組,從原始數據中讀入一個新的位元組.
2:利用剛從register移出的位元組和讀入的新位元組XOR從而產生定位下標,從table中取得相應的值。
3:把該值XOR到register中
4:如果還有未處理的數據則回到第一步繼續執行。
我的學習筆記:
對這一演算法我還是不太清楚,或許和XOR的性質有關,懇請大家指出為什麼?
謝謝。
到這,我們對CRC32的演算法原理和思想已經基本搞清了。下章,我想著重根據演算法思想用java語言實現。
⑸ Md5 和 CRC32 的區別
crc32 — 計算一個字元串的 crc32 多項式
生成 string 參數的 32 位循環冗餘校驗碼多項式……:
這句話從英文翻譯過來的,不正確,准確的說應該是這么理解:
以32位循環冗餘校驗多項式演算法,來計算一個字元串,返回一個(可能帶符號的)整數。
使用方法:
這個函數的功能類似於md5演算法、sha1演算法加密。這個函數的使用過程中,需要多考慮取返回的整數的絕對值就可以了。
至於如何能做到檢查傳輸的數據是否完整:
參考md5的常見使用場景。
32位循環冗餘校驗多項式:這個是一個數學演算法,在php的源碼內可以看到。你可以當作他是一個md5演算法的數字版。
MD5可靠性
首先是不可逆
其次,這個碼具有高度的離散性,也就是說,原信息的一點點變化就會導致MD5的巨大變化,
最後由於這個碼有128位那麼長,所以任意信息之間具有相同MD5碼的可能性非常之低,通常被認為是不可能的。
crc比較短,md5比較長
所以md5相對來說沖突的可能性要小很多
如果要求不高,是防範傳輸誤碼之類的用crc就可以了,crc效率要高很多
如果要防範人為惡意破壞,需要用md5,慢就慢點,圖個可靠性加強
⑹ 誰能給個CRC32演算法的簡單介紹啊
CRC校驗實用程序庫 在數據存儲和數據通訊領域,為了保證數據的正確,就不得不採用檢錯的手段。在諸多檢錯手段中,CRC是最著名的一種。CRC的全稱是循環冗餘校驗,其特點是:檢錯能力極強,開銷小,易於用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的幾率僅為0.0047%以下。從性能上和開銷上考慮,均遠遠優於奇偶校驗及算術和校驗等方式。因而,在數據存儲和數據通訊領域,CRC無處不在:著名的通訊協議X.25的FCS(幀檢錯序列)採用的是CRC-CCITT,ARJ、LHA等壓縮工具軟體採用的是CRC32,磁碟驅動器的讀寫採用了CRC16,通用的圖像存儲格式GIF、TIFF等也都用CRC作為檢錯手段。
CRC的本質是模-2除法的余數,採用的除數不同,CRC的類型也就不一樣。通常,CRC的除數用生成多項式來表示。最常用的CRC碼的生成多項式如表1所示。
@@10A08800.GIF;表1.最常用的CRC碼及生成多項式@@
由於CRC在通訊和數據處理軟體中經常採用,筆者在實際工作中對其演算法進行了研究和比較,總結並編寫了一個具有最高效率的CRC通用程序庫。該程序採用查表法計算CRC,在速度上優於一般的直接模仿硬體的演算法,可以應用於通訊和數據壓縮程序。
通常的CRC演算法在計算一個數據段的CRC值時,其CRC值是由求解每個數值的CRC值的和對CRC寄存器的值反復更新而得到的。這樣,求解CRC的速度較慢。通過對CRC演算法的研究,我們發現:一個8位數據加到16位累加器中去,只有累加器的高8位或低8位與數據相作用,其結果僅有256種可能的組合值。因而,我們可以用查表法來代替反復的運算,這也同樣適用於CRC32的計算。本文所提供的程序庫中,函數crchware是一般的16位CRC的演算法;mk-crctbl用以在內存中建立一個CRC數值表;crcupdate用以查表並更新CRC累加器的值;crcrevhware和crcrevupdate是反序演算法的兩個函數;BuildCRCTable、CalculateBlockCRC32和UpdateCharac
terCRC32用於CRC32的計算。
/* CRC.C——CRC程序庫 */
#define CRCCCITT 0x1021
#define CCITT-REV 0x8408
#define CRC16 0x8005
#define CRC16-REV 0xA001
#define CRC32-POLYNOMIAL 0xEDB88320L
/* 以上為CRC除數的定義 */
#define NIL 0
#define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];
#define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])
/* 以上兩個宏可以代替函數crcupdate和crcrevupdate */
#include<stdio.h>
#include<stdlib.h>
#include<alloc.h>
/* 函數crchware是傳統的CRC演算法,其返回值即CRC值 */
unsigned short crchware(data,genpoly,accum)
unsigned short data;/* 輸入的數據 */
unsigned short genpoly;/* CRC除數 */
unsigned short accum;/* CRC累加器值 */
{
static int i;
data<<=8;
for(i=8;i>0;i--)
{
if((data^accum)&0x8000)
accum=(accum<<1)^genpoly;
else
accum<<=1;
data<<=1;
}
return (accum);
}
/* 函數mk-crctbl利用函數crchware建立內存中的CRC數值表 */
unsigned short *mk-crctbl(poly,crcfn);
unsigned short poly;/* CRC除數--CRC生成多項式 */
R>unsigned short (*crcfn)();/* 指向CRC函數(例如crchware)的指針 */
{
/* unsigned short */malloc(); */
unsigned short *crctp;
int i;
if((crctp=(unsigned short*)malloc(256*sizeof(unsigned)))==0)
return 0;
for(i=0;i<256;i++)
crctp[i]=(*crcfn)(i,poly,0);
return crctp;
}
/* 函數mk-crctbl的使用範例 */
if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL)
{
puts("insuff memory for CRC lookup table.\n");
return 1; */
/* 函數crcupdate用以用查表法計算CRC值並更新CRC累加器值 */
void crcupdate(data,accum,crctab)
unsigned short data;/* 輸入的數據 */
unsigned short *accum;/* 指向CRC累加器的指針 */
unsigned short *crctab;/* 指向內存中CRC表的指針 */
{
static short comb-val;
comb-val=(*accum>>8)^data;
*accum=(*accum<<8)^crctab[comb-val];
}
/* 函數crcrevhware是傳統的CRC演算法的反序演算法,其返回值即CRC值 */
unsigned short crcrevhware(data,genpoly,accum)
unsigned short data;
unsigned short genpoly;
unsigned short accum;
{
static int i;
data<<=1;
for(i=8;i>0;i--)
{
data>>=1;
if((data^accum)&0x0001)
accum=(accum>>1)^genpoly;
else
accum>>=1;
}
return accum;
}
/* 函數crcrevupdate用以用反序查表法計算CRC值並更新CRC累加器值 */
void crcrevupdate(data,accum,crcrevtab)
unsigned short data;
unsigned short *accum;DvNews
⑺ C#crc32的計算
天哪,我的老伙計,你想知道為什麼要轉成int,
真是見鬼,其實我也不太了解。
看在上帝的份兒上,我們為什麼不坐下喝杯咖啡呢。
哦,我是說,你看這個函數的返回類型是int,
還有什麼會比返回UInt32的時候編譯器報錯更令人煩躁的呢?
⑻ CRC32演算法 尋求幫助幫助
MD5不是 只有知道密鑰才能生成相同的信息摘要,是需要知道原數據才能生成相同的摘要(不過可以碰撞破解)。在信息安全上,MD5/SHA經常和RSA一起使用做數字簽名。樓主說的一致性hash演算法,估計是指Memcache等分布式KV資料庫的一致性hash策略。
⑼ CRC8、CRC16、CRC32分別能最大計算多少位的校驗碼
CRC即循環冗餘校驗碼(Cyclic Rendancy Check):是數據通信領域中最常用的一種差錯校驗碼,其特徵是信息欄位和校驗欄位的長度可以任意選定。循環冗餘檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,並將得到的結果附在幀的後面,接收設備也執行類似的演算法,以保證數據傳輸的正確性和完整性 查看原帖>>
⑽ CRC32的演算法
通常的CRC演算法在計算一個數據段的CRC值時,其CRC值是由求解每個數值的CRC值的和對CRC寄存器的值反復更新而得到的。這樣,求解CRC的速度較慢。通過對CRC演算法的研究,我們發現:一個8位數據加到16位累加器中去,只有累加器的高8位或低8位與數據相作用,其結果僅有256種可能的組合值。因而,我們可以用查表法來代替反復的運算,這也同樣適用於CRC32的計算。本文所提供的程序庫中,函數crchware是一般的16位CRC的演算法;mk-crctbl用以在內存中建立一個CRC數值表;crcupdate用以查表並更新CRC累加器的值;crcrevhware和crcrevupdate是反序演算法的兩個函數;BuildCRCTable、CalculateBlockCRC32和UpdateCharac
terCRC32用於CRC32的計算。 /*CRC.C——CRC程序庫*/#defineCRCCCITT0x1021#defineCCITT-REV0x8408#defineCRC160x8005#defineCRC16-REV0xA001#defineCRC32-POLYNOMIAL0xEDB88320L/*以上為CRC除數的定義*/#defineNIL0#definecrcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];#definecrcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])/*以上兩個宏可以代替函數crcupdate和crcrevupdate*/#include<stdio.h>#include<stdlib.h>#include<alloc.h>/*函數crchware是傳統的CRC演算法,其返回值即CRC值*/unsignedshortcrchware(data,genpoly,accum)unsignedshortdata;/*輸入的數據*/unsignedshortgenpoly;/*CRC除數*/unsignedshortaccum;/*CRC累加器值*/{staticinti;data<<=8;for(i=8;i>0;i--){if((data^accum)&0x8000)accum=(accum<<1)^genpoly;elseaccum<<=1;data<<=1;}return(accum);}/*函數mk-crctbl利用函數crchware建立內存中的CRC數值表*/unsignedshort*mk-crctbl(poly,crcfn);unsignedshortpoly;/*CRC除數--CRC生成多項式*/R>unsignedshort(*crcfn)();/*指向CRC函數(例如crchware)的指針*/{/*unsignedshort*/malloc();*/unsignedshort*crctp;inti;if((crctp=(unsignedshort*)malloc(256*sizeof(unsigned)))==0)return0;for(i=0;i<256;i++)crctp=(*crcfn)(i,poly,0);returncrctp;}/*函數mk-crctbl的使用範例*/if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL){puts(insuffmemoryforCRClookuptable.n);return1;*//*函數crcupdate用以用查表法計算CRC值並更新CRC累加器值*/voidcrcupdate(data,accum,crctab)unsignedshortdata;/*輸入的數據*/unsignedshort*accum;/*指向CRC累加器的指針*/unsignedshort*crctab;/*指向內存中CRC表的指針*/{staticshortcomb-val;comb-val=(*accum>>8)^data;*accum=(*accum<<8)^crctab[comb-val];}/*函數crcrevhware是傳統的CRC演算法的反序演算法,其返回值即CRC值*/unsignedshortcrcrevhware(data,genpoly,accum)unsignedshortdata;unsignedshortgenpoly;unsignedshortaccum;{staticinti;data<<=1;for(i=8;i>0;i--){data>>=1;if((data^accum)&0x0001)accum=(accum>>1)^genpoly;elseaccum>>=1;}returnaccum;}/*函數crcrevupdate用以用反序查表法計算CRC值並更新CRC累加器值*/voidcrcrevupdate(data,accum,crcrevtab)unsignedshortdata;unsignedshort*accum;DvNews2.
crc32 — 計算一個字元串的 crc32 多項式