標籤:zip define oid else enter sdl 位元 color 亦或
CRC16實現代碼
思路:取一個字元(8bit),逐位檢查該字元,如果為1,crc^crc_mul;同時,如果原本crc最高位是1,那麼crc^crc_mul後左移1位,否則只是左移一位。計算完一個字元後,裝入下一個字元。
#include<stdio.h>#define crc_mul 0x1021 //產生多項式unsigned int cal_crc(unsigned char *ptr, unsigned char len){ unsigned char i; unsigned int crc=0; while(len-- != 0) { for(i=0x80; i!=0; i>>=1) { if((crc&0x8000)!=0) { crc<<=1; crc^=(crc_mul); }else{ crc<<=1; } if((*ptr&i)!=0) { crc ^= (crc_mul); } } ptr ++; } return (crc);}int main(){ unsigned char i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3}; unsigned int crc; crc=cal_crc(i,8); return 0;}
CRC32編碼字元表
#include<stdio.h>unsigned int CRC32_table[256] = {0};void init_CRC32_table(){ for (int i = 0; i != 256; i++) { unsigned int CRC = i; for (int j = 0; j != 8; j++) { if (CRC & 1) CRC = (CRC >> 1) ^ 0xEDB88320; else CRC >>= 1; } CRC32_table[i] = CRC; }}unsigned int GetCRC32(unsigned char* buf, unsigned int len){ unsigned int CRC32_data = 0xFFFFFFFF; for (unsigned int i = 0; i != len; ++i) { unsigned int t = (CRC32_data ^ buf[i]) & 0xFF; CRC32_data = ((CRC32_data >> 8) & 0xFFFFFF) ^ CRC32_table[t]; } return ~CRC32_data;}int main(){ unsigned char i[8] = {0x00,0x00,0x00,0x00,0x06,0x0d,0xd2,0xe3}; init_CRC32_table(); printf("BUFFER i‘s CRC32: 0x%x\n", GetCRC32(i,8)); printf("CRC32 TABLE:\n"); for(int i=0;i<256;i++) { printf("0x%8x\t",CRC32_table[i]); if((i+1)%8 == 0) printf("\n"); }}
CRC校正碼的手動計算樣本
產生多項式:G(X)=X4+X3+1,要求出二進位序列10110011的CRC校正碼。
(1)G(X)=X4+X3+1,二進位位元串為11001;(有X的幾次方,對應的2的幾次方的位就是1)
(2)因為校正碼4位,所以10110011後面再加4個0,得到101100110000,用“模2除法”(其實就是亦或^)即可得出結果;
圖5-10 CRC校正碼計算樣本
(3)CRC^101100110000得到101100110100。發送到接收端;
(4)接收端收到101100110100後除以11001(以“模2除法”方式去除),餘數為0則無差錯;
CRC校正原理
在k位資訊碼後再拼接r位的校正碼,報文編碼長度為n位,因此,這種編碼又叫(n,k)碼。
定理:對於一個給定的(n,k)碼,可以證明,存在一個最高次冪為n=k+r的多項式G(x),存在且僅存在一個R次多項式G(x),使得。
其中:
m(x) :k次資訊多項式,
r(x) :r-1次校正多項式,
g(x):產生多項式:。
發送方通過指定的G(x)產生r位的CRC校正碼,接收方則通過該G(x)來驗證收到的報文碼的CRC校正碼是否為0。
假設發送資訊用資訊多項式C(X)表示,將C(x)左移r位,則可表示成C(x)*2r,這樣C(x)的右邊就會空出r位校正碼的位置,做除法(模2除),得到的餘數R就是校正碼。發送的CRC編碼是,驗證接收到的報文編碼是否至正確,依然是做模2除:。
CRC的產生多項式
產生多項式的選取應滿足以下條件:
a、產生多項式的最高位和最低位必須為1。
b、當被傳送資訊(CRC碼)任何一位發生錯誤時,被產生多項式做模2除後,應該使餘數不為0。
c、不同位發生錯誤時,應該使餘數不同。
d、對餘數繼續做模2除,應使餘數迴圈。
主要的產生多項式G(x)有以下幾種:
名稱 |
產生多項式 |
數值式 |
簡記式 |
標準引用 |
CRC-16 |
x16+x15+x2+1 |
0x1’8005 |
8005 |
IBM SDLC |
CRC-CCITT |
x16+x12+x5+1 |
0X1’1021 |
0x1021 |
ISO HDLC,ITU X.25,V.34/V.41/V.42,PPP-FCS |
CRC-32 |
注* |
0X1’04C11DB7 |
0x04C11DB7 |
ZIP,RAR,IEEE 802 LAN/FDDI,IEEE1394,PPP-FCS |
注* x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
下表中的產生多項式G(x)也常見的:
名稱 |
產生多項式 |
數值式 |
簡記式 |
標準引用 |
CRC-4 |
x4+x+1 |
0x1’3 |
0x3 |
ITU G.704 |
CRC-8 |
x8+x5+x4+1 |
0x1’31 |
0x31 |
|
CRC-8 |
x8+x2+x1+1 |
0x1’07 |
0x07 |
|
CRC-8 |
x8+x6+x4+x3+x2+x1 |
0x1’5E |
0x5E |
|
CRC-12 |
x12+x11+x3+x2+x+1 |
0x1’80F |
0x80F |
|
CRC-32c |
注** |
0X1’1EDC6F41 |
0x1EDC6F41 |
SCTP |
注** x32+x28+x27+x26+x25+x23+x22+x20+x19+x18+x14+x13+x11+x10+x9+x8+x6+1
CRC校正碼原理、執行個體、手動計算