導航:首頁 > 源碼編譯 > crc16計演算法

crc16計演算法

發布時間:2024-09-22 05:06:19

❶ CRC-16 計算方法及程序設計

CRC-16演算法是一種用於數據傳輸錯誤檢測的常用校驗技術,它基於16位的二進制寄存器對數據幀中的每個位元組進行異或運算和位移操作。發送設備在數據幀尾部添加生成的CRC值,接收端則重新計算並與接收到的值對比,確認數據完整無誤。具體步驟如下:

1. 初始化16位CRC寄存器為全1(0xFFFFH)。
2. 對數據幀的第一個位元組的8位進行異或操作,將結果存回寄存器。
3. 移位操作:將寄存器右移一位,高位補0,低位丟棄並檢測。
4. 若低位為1,則寄存器與預設值0xA001進行異或;否則,僅做右移。
5. 重復步驟3和4,直至完成8次移位,處理一個完整的8位位元組。
6. 對下一個位元組重復此過程,直至處理完所有位元組。
7. CRC寄存器的最終值即為CRC校驗值。

以示例數據0x03 0x10 0x00 0x01 0x00 0x08為例,通過C語言實現的CRC-16計算過程展示了這個過程。在VHDL語言中,也有類似的進程來接收數據並進行CRC校驗,涉及狀態機和邏輯運算,確保數據的正確傳輸和接收。

❷ crc16校驗的c語言程序

下面我們以CRC-16為例來說明任意長度數據流的CRC校驗碼生成過程。我們採用將數據流分成若干個8bit字元,並由低位元組到高位元組傳送的並行方法來求CRC校驗碼。具體計算過程為:用一個16bit的寄存器來存放CRC校驗值,且設定其初值為0x0000;將數據流的第一個8bit與16bit的CRC寄存器的高位元組相異或,並將結果存入CRC寄存器高位元組;CRC寄存器左移一位,最低1bit補零,同時檢查移出的最高1bit,若移出的最高1bit為0,則繼續按上述過程左移,若最高1bit為1,則將CRC寄存器中的值與生成多項式碼相異或,結果存入CRC寄存器值;繼續左移並重復上述處理方法,直到將8bit數據處理完為止,則此時CRC寄存器中的值就是第一個8bit數據對應的CRC校驗碼;然後將此時CRC寄存器的值作為初值,用同樣的處理方法重復上述步驟來處理下一個8bit數據流,直到將所有的8bit字元都處理完後,此刻CRC寄存器中的值即為整個數據流對應的CRC校驗碼。
下面示出了其計算過程的流程圖:

在用C語言編寫CRC校驗碼的實現程序時我們應該注意,生成多項式 對應的十六進制數為0x18005,由於CRC寄存器左移過程中,移出的最高位為1時與 相異或,所以與16bit的CRC寄存器對應的生成多項式的十六進制數可用0x8005表示。下面給出並行處理8bit數據流的C源程序:
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg為crc寄存器, data_crc為將要處理的8bit數據流
{
unsigned short msb; //crc寄存器將移出的最高1bit
unsigned short data;
unsigned short gx = 0x8005, i = 0; //i為左移次數, gx為生成多項式

data = (unsigned short)data_crc;
data = data << 8;
reg = reg ^ data;
do
{
msb = reg & 0x8000;
reg = reg << 1;
if(msb == 0x8000)
{
reg = reg ^ gx;
}
i++;
}
while(i < 8);
return (reg);
}
以上為處理每一個8bit數據流的子程序,在計算整個數據流的CRC校驗碼時,我們只需將CRC_reg的初值置為0x0000,求第一個8bit的CRC值,之後,即可將上次求得的CRC值和本次將要處理的8bit數據作為函數實參傳遞給上述子程序的形參進行處理即可,最終返回的reg值便是我們所想得到的整個數據流的CRC校驗值。

❸ CRC碼的計算方法

給信息碼補5個0,然後去除多項式,余數就是較驗碼

❹ 使用半位元組查表法之 CRC16 的 code sample

多項式除法在進行CRC計算之前是必須重溫的基礎知識。具體方法可以參考certmaths.ilongman.com/...的ppt文檔。在多項式除法中,當面對多項式除以單項式時,我們能利用分配率進行處理;面對多項式除以多項式時,則需要使用長除法。

CRC原理簡單來說,就是將待傳送的數據M的二進制碼序列視為多項式M,預先選定一個r+1 bit的二進制數作為多項式P,進行M除以P操作,得到的商和余數分別記為Q和R(r bit),將余數R附加在信息碼M一起發送。在接收端,同樣使用M/P獲取余數R',並與R進行比較,以驗證M的正確性。

多項式除法的詳細步驟在進行CRC計算時至關重要。以下是一個具體的例子:假設信息位為1011001,CRC碼為4位,校驗多項式(生成碼)為11001。首先將信息位左移4位得到10110010000,然後除以11001,遵循不借位除法的法則(即異或運算),得到余數1010,即為CRC碼。

在CRC的實現方法中,有基本演算法、位元組查表法、半位元組查表法等。本文重點討論16 bit的CRC實現,具體為CRC16-CCITT,即X16+X12+X5+1,生成碼為0x1021。值得注意的是,實際值為0x010121,但由於"最高位一定為1故拋棄"的運演算法則,實際使用的是0x1021。

具體實現中,基本演算法和位元組查表法的常式通常提供,但並未經過驗證。半位元組查表法則在處理速度和對代碼空間的要求上表現出優勢,相較於位元組查表法(需要512bytes的數組),它對代碼空間的要求更低。

在討論中提到,半位元組查表法在微處理器有限的資源下,是較為適合的CRC計算模式。同時,文中還對16 bit的0x1021 CRC碼的半位元組查表法常式進行了簡單的結果驗證,以供項目提供比對和參考。需指出的是,這個驗證工作是在2010年8月5日通宵工作後完成的,對數學原理的探究較為概括,但最終的CRC16半位元組查表法函數得到了簡單的驗證,具有一定的實用價值。

❺ crc校驗碼計算方法是什麼

已知信息位為1100,生成多項式G(x) = x3+x+1,求CRC碼。

M(x) = 1100 M(x)*x3 = 1100000 G(x) = 1011

M(x)*x3 / G(x) = 1110 + 010 /1011 R(x) = 010

CRC碼為: M(x)*x 3+R(x)=1100000+010 =1100010

其原理是:CRC碼一般在k位信息位之後拼接r位校驗位生成。編碼步驟如下:

(1)將待編碼的k位信息表示成多項式 M(x)。

(2)將 M(x)左移 r 位,得到 M(x)*xr 。

(3)用r+1位的生成多項式G(x)去除M(x)*xr 得到余數R(x)。

(4)將M(x)*xr 與R(x)作模2加,得到CRC碼。

(5)crc16計演算法擴展閱讀:

CRC校驗碼計算詳解:採用CRC進行差錯檢驗,生成多項式為G(X)=X4+X+1,信息碼字為10110,則計算出的CRC校驗碼是:A. 0000 B. 0100 C. 0010 D.1111

符號表示假定:多項式和多項式的系數排列均用相同的符號表示,如

G(X)= X4+X+1

G(X)=10011

已知條件如下:

原碼字記做M(X),即:M(X) = 10110

生成多項式記做G(X),即:G(X) = 10011

G(X)的最高階數記做r,此處r = 4

閱讀全文

與crc16計演算法相關的資料

熱點內容
debian系統命令行如何排序 瀏覽:404
車壓縮機保修幾年 瀏覽:307
linux同步腳本 瀏覽:664
福建新唐集成硬體加密 瀏覽:943
空調壓縮機被破壞 瀏覽:105
現在學php怎麼樣 瀏覽:90
linuxchttp下載 瀏覽:770
大數據虛擬機雲伺服器 瀏覽:57
java與嵌入式開發 瀏覽:20
minios如何搭建文件伺服器 瀏覽:1000
華為為啥有些壓縮包解壓不開 瀏覽:563
oracle可以編譯存儲嗎 瀏覽:475
機械男和女程序員創業 瀏覽:799
自己怎麼製作軟體app 瀏覽:214
javajson字元串轉java對象 瀏覽:230
必修一數學PDF 瀏覽:775
javascriptphpjsp 瀏覽:811
深圳一程序員退房完整版 瀏覽:295
後台管理app哪個好 瀏覽:766
加密鎖無模塊什麼意思 瀏覽:22