unsigned int cal_crc(unsigned char *ptr, unsigned char len) /* 余式crc乘以2再求crc */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的crc */
}ptr++;
}return(crc);
}按位計算crc雖然**簡單,所占用的記憶體比較少,但其最大的缺點就是一位一位地計算會占用很多的處理器處理時間,尤其在高速通訊的場合,這個缺點更是不可容忍。因此下面再介紹一種按位元組查表快速計算crc的方法。
4 按位元組計算crc
不難理解,對於乙個二進位制序列數可以按位元組表示為式(4-1),其中 為乙個位元組(共8位)。
(4-1)
求此二進位制序列數的crc碼時,先乘以 後(既左移16位),再除以多項式g(x),所得的餘數既是所要求的crc碼。如式(4-2)所示:
(4-2)
可以設: (4-3)
其中 為整數, 為16位二進位制餘數。將式(4-3)代入式(4-2)得:
(4-4)
因為:(4-5)
(4-6)
再設: (4-7)
其中 為整數, 為16位二進位制餘數。將式(4-7)代入式(4-6),如上類推,最後得:
(4-8)
很顯然,十六位二進位制數 既是我們要求的crc碼。
式(4-7)是編寫按位元組計算crc程式的關鍵,它說明計算本位元組後的crc碼等於上一位元組余式crc碼的低8位左移8位後,再加上上一位元組crc右移8位(也既取高8位)和本位元組之和後所求得的crc碼,如果我們把8位二進位制序列數的crc全部計算出來,放如乙個表裡,採用查表法,可以大大提高計算速度。由此不難理解下面按位元組求crc碼的c語言程式。*ptr指向傳送緩衝區的首位元組,len是要傳送的總位元組數,crc余式表是按0x11021多項式求出的。
unsigned int cal_crc(unsigned char *ptr, unsigned char len) ;
crc=0;
while(len--!=0)
return(crc);
}很顯然,按位元組求crc時,由於採用了查表法,大大提高了計算速度。但對於廣泛運用的8位微處理器,**空間有限,對於要求256個crc余式表(共512位元組的記憶體)已經顯得捉襟見肘了,但crc的計算速度又不可以太慢,因此再介紹下面一種按半位元組求crc的演算法。
5 按半位元組計算crc
同樣道理,對於乙個二進位制序列數可以按位元組表示為式(5-1),其中 為半個位元組(共4位)。
(5-1)
求此二進位制序列數的crc碼時,先乘以 後(既左移16位),再除以多項式g(x),所得的餘數既是所要求的crc碼。如式(4-2)所示:
(5-2)
可以設: (5-3)
其中 為整數, 為16位二進位制餘數。將式(5-3)代入式(5-2)得:
(5-4)
因為:(5-5)
(5-6)
再設: (5-7)
其中 為整數, 為16位二進位制餘數。將式(5-7)代入式(5-6),如上類推,最後得:
(5-8)
很顯然,十六位二進位制數 既是我們要求的crc碼。
式(5-7)是編寫按位元組計算crc程式的關鍵,它說明計算本位元組後的crc碼等於上一位元組crc碼的低12位左移4位後,再加上上一位元組余式crc右移4位(也既取高4位)和本位元組之和後所求得的crc碼,如果我們把4位二進位制序列數的crc全部計算出來,放在乙個表裡,採用查表法,每個位元組算兩次(半位元組算一次),可以在速度和記憶體空間取得均衡。由此不難理解下面按半位元組求crc碼的c語言程式。*ptr指向傳送緩衝區的首位元組,len是要傳送的總位元組數,crc余式表是按0x11021多項式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len)
crc=0;
while(len--!=0)
return(crc);
}5 結束語
以上介紹的三種求crc的程式,按位求法速度較慢,但占用最小的記憶體空間;按位元組查表求crc的方法速度較快,但占用較大的記憶體;按半位元組查表求crc的方法是前兩者的均衡,即不會占用太多的記憶體,同時速度又不至於太慢,比較適合8位小記憶體的微控制器的應用場合。以上所給的c程式可以根據各微處理器編譯器的特點作相應的改變,比如把crc余式表放到程式儲存區內等。
計算udp校驗和例子 UDP校驗和計算例項
udp校驗和的計算例項說明 成都資訊工程學院 鄭郁正 如下定義乙個udp的以太包。為了方便,只包含兩個位元組資料0x55,0xaa。unsigned char udp et pkt 參與udp校驗計算的由三部分組成 udp頭,udp資料,udp偽頭,如下面所示 unsigned char udp c...
UDP校驗和計算
目錄 一 udp概述 二 udp資料報 三 udp校驗和計算 四 udp校驗和計算的c語言實現及抓包驗證 udp是user datagram protocol的簡稱,中文名是使用者資料報協議,是osi open system interconnection,開放式系統互聯 參考模型中一種無連線的傳輸...
ip首部校驗和計算
ip首部校驗和的計算方法 1.把校驗和字段清零。2.然後對每16位 2位元組 進行二進位制反碼求和,反碼求和的意思是先對每16位求和,再將得到的和轉為反碼。接下來詳細描述反碼求和的步驟 看下面的 演算法 short checksum ushort buffer,int size if size ck...