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=(*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
相關詞條
-
sfv格式
,它利用 CRC32 算法來完成簡易的檔案檢測功能,對每個檔案計算出一個...等,並保存下來。CRC32: CRC本身是“冗餘校驗碼”的意思。CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。由於CRC32產生...
1.sfv是什麼檔案? 2.有什麼用? 3.製作和使用 -
sfv
的是crc32的校驗算法。crc32校驗產生32bit(8位十六進制數...crc32產生校驗值時源數據塊的每一個bit位都參與了計算,所以數據塊中即使一位bit發生變化,也會得到不同的crc32值(但對於兩個完全不相干...
格式說明 校驗算法 -
摘要算法
,尤其是通訊領域,現在套用最多的就是 CRC32 算法,它產生一個4位元組...。在 WinRAR、WinZIP 等軟體中,也是以 CRC32 作為檔案校驗算法...)也是以 CRC32算法為基礎,它通過生成一個後綴名為 .SFV...
分類 測試 -
SSE 4.2
等。 更具體地說,SSE4.2 加入七個新指令:CRC32...
SEE4.2簡介 SSE 4.2報價 SEE4指令集家族介紹 -
全局唯一標識分區表
儲存著它本身和分區表的CRC32校驗。固件、引導程式和作業系統在啟動時...)的CRC32校驗,在計算時,把這個欄位作為0處理,需要計算出分區串列的CRC32校驗後再計算本欄位204位元組保留,必須是 0248位元組當前LBA...
介紹 特點 結構 -
SSE4.2
指令ATA。ATA包括 冗餘校驗的CRC32指令、計算源 運算元中非0位...。CRC32指令可以取代上層數據協定中經常用到的循環冗餘校驗,據Intel表示...
簡介 -
自定義指令集
開始成為一個關注的焦點。本文通過CRC32對SOPC系統中的自定義外設和...。 1.2 CRC32自定義外設的實現 CRC32校驗可以由軟體或硬體來...成了完整的碼字。 採用HDL語言來描述出CRC32的硬體實現,命名為...
含義 自定義外設和自定義指令性能分析 指令集 -
CSV
數字 4FB55FE8,這是檔案的 CRC32 校驗值。整個 CSV 檔案...的 CRC 值是用專門的軟體通過 CRC32 算法(常用的 CRC 算法...。那么,用同樣的 CRC32 算法再對檔案進行運算後產生的 CRC 校驗值...
用法 規則 實例 規範 作用