崔彥坤 馬萌
摘要:介紹了循環冗余校驗(CRC)算法的原理和循環冗余校驗算法設計分析過程,給出了使用查表法詳細的算法設計。描述了VEE可視化語言中使用的重要模塊及使用VEE語言實現CRC校驗算法的具體設計過程,并且給出了詳細的設計流程,該方法校驗速度非常快,提高了計算機網絡通信的速度和報文傳輸的準確性,使用手動算法舉例驗證了該算法的準確性。
關鍵詞:循環冗余;CRC校驗;VEE可視化語言
中圖分類號:TP316文獻標志碼:A文章編號:1008-1739(2019)01-62-3

0引言
計算機串口通信中,為防止數據通信錯誤,一般采用奇偶校驗法和糾錯校驗法等方法進行校驗。但在一些通信安全要求嚴格的場合,上述2種方法均不能滿足要求,需要采用CRC校驗原理進行校驗。CRC校驗法是一種在數據通信和數據壓縮中廣泛使用的循環校驗法,以低出錯率保證數據的可靠無差錯傳輸,因此,已被標準化納入TCP/IP和其他協議的校驗中,并且遵循ISO/OSI標準工業現場總線通信(IEC61158)。
隨著通信領域的快速發展,數據傳輸的可靠性顯得尤為重要,為了保證數據在傳送過程中的正確無誤,不僅需要高可靠的硬件電路,同時還需要查錯檢查機制。CRC校驗法是數據通信領域中最常用的一種查錯校驗法,其特征是信息字段和校驗字段的長度可以任意選定,CRC校驗法也具有數據傳輸檢錯功能,對數據進行多形式計算,并將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性[1]。
1 CRC校驗的原理
CRC校驗原理實際上就是在一個P位二進制數據序列之后附加一個r位二進制檢驗碼,從而構成一個總長度為n=P+r位的二進制序列,附加在數據序列之后的這個校驗碼與數據序列的內容之間存在著某種特定的關系[2]。如果因干擾原因,數據序列中的某一位或某些位發生錯誤,這種特定的關系就會被破壞,因此,通過檢查這一關系,就可以實現對數據正確性的檢查。
CRC校驗就是一種被廣泛采用的錯誤檢驗編碼,是計算機網絡通信中運用最多的一種可靠性很高的檢錯編碼方式,是由分組線性碼的分支而來,有較少的冗余位,漏檢率很低,從而可以有效地提高傳輸速度。其二元碼組編碼簡單且誤判概率很低,在通信系統中得到了廣泛應用。循環冗余校驗的算法實現包括硬件實現和軟件實現,硬件實現速度很慢,軟件實現方法就相對較快[3],以太網就采用32位的循環冗余校驗編碼方式。
2循環冗余校驗算法
2.1 VEE可視化語言
不同的語言對算法的實現過程都是一樣的,現在的編程語言種類繁多,由于通信設備對設備的控制及儀器之間處理要求比較嚴格,因此在數據校驗方面要求更為嚴格。VEE是一種主要用于儀器控制和測量處理的可視化編程語言,它集成儀器設備控制、高級數據采集及處理、數據分析顯示等眾多先進技術,可運行于Windows,SUN,Unix等多種平臺的測試軟件開發環境,其強大的使用圖形顯示以及便捷的程序設計能力,為過程控制及測試、測量自動化提供了很好的解決方案。它還適用于產品的跟蹤測試,包括從產品設計、生產及品質控制等一系列的產品指導過程,其基本單元是一系列的功能控件,所有功能控件是在VEE下選取和創建的,連線完成一次程序[4],使用VEE自動測試語言設計測試平臺在測試領域已經很普遍,本文主要使用VEE可視化語言實現CRC校驗算法的設計過程。
2.2具體算法過程
使用VEE語言設計CRC校驗過程中,先將字符串轉為以字節為單位的數組,分別輸出每個字節進行逐一循環校驗,最終CRC校驗碼為“源CRC校驗碼”(初始為0,可視為0000,0000,0000,0000)的高8位左移后與本字節異或(異或結果設為)。查表取第位的值(這個值是16位的)與“源CRC校驗碼”異或后得出的16位是“CRC校驗碼”,將剛得出的“CRC校驗碼”賦值給“源CRC校驗碼”,繼續進行下一個字節的校驗,直到最后一個字節校驗完成后得出“CRC校驗碼”,即為這段字符串的“最終CRC校驗碼”,并在該數據段的末尾加上該校驗碼,這樣就構成了一個完成的數據包,以12ab為例介紹CRC檢驗具體實現過程[5],主要設計流程如圖1所示。
①使用VEE語言實現字符串轉數組,先確定字符串長度,再算出字節數。分別將字符按順序2個一組取出,并將取出的字節轉換成一維數組,然后輸出。主要使用到的模塊有strLen(str),該模塊為取字符串長度,然后通過除2和循環單獨取字節,strFromLen (str,from,len)中str代表要轉換的字符串,from代表要開始截取的字符,len代表截取字符的總長度,其次還是用到collector收集器,使用這3個模塊和基本的計算循環便可實現字符串轉數組。
②進制轉換在CRC校驗中使用最多,主要包括十進制轉二進制、十進制轉十六進制、二進制轉十進制,十六進制轉十進制、十六進制轉二進制等,以十進制轉十六進制為例,主要思想就是除16,整個十進制數循除以16的0次方、1次方、2次方和3次方,除后所得余數和除數(取整)分別記錄在相應的位置,余數10~15分別對應字母a~f,以1234為例,1234/162取整為4,余數為210,210/161取整13,余數為2,則十進制1234對應的十六進制數為ox04d2。
③手動計算異或即轉換成二進制后,0和1同則0,異則1,VEE可視化語言里的bitXor(x,y)實現了計算異或功能,直接輸入需要的異或值,便可直接輸出結果。
④計算循環冗余校驗碼表,外循環從0~255,每次循環把要計算字節送入余數單元(4 byte)最低位字節中,然后左移8位。內循環次數為8,每次循環先將余數單元中數據左移一位,最低位補0。2次循環結束之后就可以算出整個循環冗余校驗碼表,即把0~255的CRC碼計算出來,存儲至表格里,然后再根據字節查詢對應CRC碼。
3試驗仿真
CRC校驗是通信設備常用的一種校驗法,VEE可視化語言是安捷倫公司推出的一款專門控制儀器儀表及設備的語言,使用VEE語言控制設備進行通信就需要使用到CRC校驗來驗證數據傳輸的正確性,因此使用VEE設計實現CRC校驗是控制通信設備進行設備遠程測試的重要環節。

CRC校驗有計算和查表2種方法,計算法(以CRC16為例)為校驗數轉換為二進制數后左移16位,然后開始與17位二進制(1000 1000 0001 0000 1)異或,直到把右邊最后一位異或完成為止,所得結果轉換為16進制,即為該校驗數的校驗碼,以計算法來驗證12ab的校驗過程,具體過程為:

根據手動校驗12ab來驗證該程序的準確性,最終結果與程序一致。2個字節的計算相對比較簡單,可是在現實設備使用中字節相當長,如果使用手動計算特別耗費人力和時間,經過多方驗證,該程序與手動計算完全一致。
4結束語
本質上循環冗余校驗計算的就是移位和異或,所以一次處理移動幾位都沒有關系,只要做相應的處理就好了。循環冗余校驗實現簡單、檢錯能力強,提高了通信速度,占用系統資源少,用軟硬件均能實現,一定程度上解決了傳輸速率和校驗時間的矛盾,是計算機網絡通信中對數據包進行檢錯很好的手段[6]。CRC是一種常用的檢錯校驗法,它不具備自動糾錯,只要經過嚴格的校驗,并使用足夠多的排查,那么出現檢測不到的差錯概率就會很小,使用CRC差錯檢測技術只能做到無差錯傳輸,并不可保證完全可靠傳輸。
參考文獻
[1]許偉,王曉燕. CRC算法在計算機網絡通信中的應用[J].數字技術與應用,2014(2):119.
[2]秦紅磊,路輝,朗榮玲.自動測試系統———硬件及軟件技術[M].北京:高等教育出版社,2007.
[3]陶傳會.淺議CRC算法在計算機網絡通信中應用[J].信息與電腦(理論版),2011(5):136.
[4]聽雨軒工作室.AgilentVEE虛擬儀器工程設計與開發[M].北京:國防工業出版社,2004.
[5]邱林海.多媒體通信中CRC碼及其快速算法設計[J].小型微型機算機系統,1998(11):18-20.
[6]劉星華.循環冗余校驗校驗在單片機系統中的軟件快速實現[J].福建工程學院學報,2007,5(1):76-78.