国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

VB下如何編寫CRC校驗程序

2024-07-21 02:20:48
字體:
來源:轉載
供稿:網友
隨著計算機技術的不斷發展,在現代工業中,利用微機進行數據通訊的工業控制應用得也越來越廣泛。由于傳輸距離、現場狀況等諸多可能出現的因素影響,計算機與受控設備之間的通訊數據常會發生無法預測的錯誤。為了防止錯誤所帶來的影響,一般在通訊時采取數據校驗的辦法,而循環冗余碼校驗是最常用的校驗方法之一。

一、循環冗余碼校驗原理

  循環冗余碼校驗英文名稱為cyclical redundancy check,簡稱crc。它是利用除法及余數的原理來作錯誤偵測(error detecting)的。實際應用時,發送裝置計算出crc值并隨數據一同發送給接收裝置,接收裝置對收到的數據重新計算crc并與收到的crc相比較,若兩個crc值不同,則說明數據通訊出現錯誤。

根據應用環境與習慣的不同,crc又可分為以下幾種標準:

  ①crc-12碼;

  ②crc-16碼;

  ③crc-ccitt碼;

  ④crc-32碼。

  crc-12碼通常用來傳送6-bit字符串。crc-16及crc-ccitt碼則用是來傳送8-bit字符,其中crc-16為美國采用,而crc-ccitt為歐洲國家所采用。crc-32碼大都被采用在一種稱為point-to-point的同步傳輸中。

下面以最常用的crc-16為例來說明其生成過程。

  crc-16碼由兩個字節構成,在開始時crc寄存器的每一位都預置為1,然后把crc寄存器與8-bit的數據進行異或,之后對crc寄存器從高到低進行移位,在最高位(msb)的位置補零,而最低位(lsb,移位后已經被移出crc寄存器)如果為1,則把寄存器與預定義的多項式碼進行異或,否則如果 lsb為零,則無需進行異或。重復上述的由高至低的移位8次,第一個8-bit數據處理完畢,用此時crc寄存器的值與下一個8-bit數據異或并進行如前一個數據似的8次移位。所有的字符處理完成后crc寄存器內的值即為最終的crc值。

  下面為crc的計算過程:

  1.設置crc寄存器,并給其賦值ffff(hex)。

  2.將數據的第一個8-bit字符與16位crc寄存器的低8位進行異或,并把結果存入crc寄存器。

  3.crc寄存器向右移一位,msb補零,移出并檢查lsb。

  4.如果lsb為0,重復第三步;若lsb為1,crc寄存器與多項式碼相異或。

  5.重復第3與第4步直到8次移位全部完成。此時一個8-bit數據處理完畢。

  6.重復第2至第5步直到所有數據全部處理完成。

  7.最終crc寄存器的內容即為crc值。

二、 循環冗余碼校驗程序的編寫


  明白了crc校驗碼的產生過程,編寫起程序來就非常容易了。由于visual basic的廣泛普及以及其在數據通訊中的重要地位,下面就以vb語言來編寫crc的生成程序,其它語言只需稍做修改即可。

  編寫crc校驗程序有兩種辦法:一種為計算法,一種為查表法。下面對兩種方法分別討論。


  1.計算法

  計算法就是依據crc校驗碼的產生原理來設計程序。其優點是模塊代碼少,修改靈活,可移植性好。其缺點為計算量大。為了便于理解,這里假定了三位數據,而多項式碼為a001(hex)。

  在窗體上放置一命令按鈕command1,并添加如下代碼:


  private sub command1_click()

   dim crc() as byte

   dim d() as byte ’待傳輸數據

   redim d(2) as byte

   d(0) = 123

   d(1) = 112

   d(2) = 135

   crc = crc16(d) ’調用crc16計算函數

   ’crc(0)為高位

   ’crc(1)為低位

  end sub

  注意:在數據傳輸時crc的低位可能在前,而高位在后。


  function crc16(data() as byte) as string

   dim crc16lo as byte, crc16hi as byte   ’crc寄存器

   dim cl as byte, ch as byte        ’多項式碼&ha001

   dim savehi as byte, savelo as byte

   dim i as integer

   dim flag as integer

   crc16lo = &hff

   crc16hi = &hff

   cl = &h1

   ch = &ha0

   for i = 0 to ubound(data)

    crc16lo = crc16lo xor data(i) ’每一個數據與crc寄存器進行異或

    for flag = 0 to 7

     savehi = crc16hi

     savelo = crc16lo

     crc16hi = crc16hi / 2      ’高位右移一位

     crc16lo = crc16lo / 2      ’低位右移一位

     if ((savehi and &h1) = &h1) then ’如果高位字節最后一位為1

      crc16lo = crc16lo or &h80   ’則低位字節右移后前面補1

     end if              ’否則自動補0

     if ((savelo and &h1) = &h1) then ’如果lsb為1,則與多項式碼進行異或

      crc16hi = crc16hi xor ch

      crc16lo = crc16lo xor cl

     end if

    next flag

   next i

   dim returndata(1) as byte

   returndata(0) = crc16hi       ’crc高位

   returndata(1) = crc16lo       ’crc低位

   crc16 = returndata

  end function

  2.查表法

  查表法的優缺點與計算法的正好相反。為了便于比較,這里所有的假定與計算法的完全相同,都而在窗體上放置一個command1的按鈕,其代碼部分與上面的也完全一致。下面只介紹crc函數的編寫源代碼。


  private function crc16(data() as byte) as string

   dim crc16hi as byte

   dim crc16lo as byte

   crc16hi = &hff

   crc16lo = &hff

   dim i as integer

   dim iindex as long

   for i = 0 to ubound(data)

    iindex = crc16lo xor data(i)

    crc16lo = crc16hi xor getcrclo(iindex)    ’低位處理

    crc16hi = getcrchi(iindex)          ’高位處理

   next i

   dim returndata(1) as byte

   returndata(0) = crc16hi    ’crc高位

   returndata(1) = crc16lo    ’crc低位

   crc16 = returndata

  end function


  ’crc低位字節值表

  function getcrclo(ind as long) as byte

   getcrclo = choose(ind + 1, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, _

&h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40, &h1, &hc0, &h80, &h41, &h1, &hc0, &h80, &h41, &h0, &hc1, &h81, &h40)

  end function


  ’crc高位字節值表

  function getcrchi(ind as long) as byte

   getcrchi = choose(ind + 1, &h0, &hc0, &hc1, &h1, &hc3, &h3, &h2, &hc2, &hc6, &h6, &h7, &hc7, &h5, &hc5, &hc4, &h4, &hcc, &hc, &hd, &hcd, &hf, &hcf, &hce, &he, &ha, &hca, &hcb, &hb, &hc9, &h9, &h8, &hc8, &hd8, &h18, &h19, &hd9, &h1b, &hdb, &had, &h1a, &h1e, &hde, &hdf, &h1f, &hdd, &h1d, &h1c, &hdc, &h14, &hd4, &hd5, &h15, &hd7, &h17, &h16, &hd6, &hd2, &h12, &h13, &hd3, &h11, &hd1, &hd0, &h10, &hf0, &h30, &h31, &hf1, &h33, &hf3, &hf2, &h32, &h36, &hf6, &hf7, &h37, &hf5, &h35, &h34, &hf4, &h3c, &hfc, &hfd, &h3d, &hff, &h3f, &h3e, &hfe, &hfa, &h3a, &h3b, &hfb, &h39, &hf9, &hf8, &h38, &h28, &he8, &he9, &h29, &heb, &h2b, &h2a, &hea, &hee, &h2e, &h2f, &hef, &h2d, &hed, &hec, &h2c, &he4, &h24, &h25, &he5, &h27, &he7, &he6, &h26, &h22, &he2, &he3, &h23, &he1, &h21, &h20, &he0, &ha0, &h60, _

&h61, &ha1, &h63, &ha3, &ha2, &h62, &h66, &ha6, &ha7, &h67, &ha5, &h65, &h64, &ha4, &h6c, &hac, &had, &h6d, &haf, &h6f, &h6e, &hae, &haa, &h6a, &h6b, &hab, &h69, &ha9, &ha8, &h68, &h78, &hb8, &hb9, &h79, &hbb, &h7b, &h7a, &hba, &hbe, &h7e, &h7f, &hbf, &h7d, &hbd, &hbc, &h7c, &hb4, &h74, &h75, &hb5, &h77, &hb7, &hb6, &h76, &h72, &hb2, &hb3, &h73, &hb1, &h71, &h70, &hb0, &h50, &h90, &h91, &h51, &h93, &h53, &h52, &h92, &h96, &h56, &h57, &h97, &h55, &h95, &h94, &h54, &h9c, &h5c, &h5d, &h9d, &h5f, &h9f, &h9e, &h5e, &h5a, &h9a, &h9b, &h5b, &h99, &h59, &h58, &h98, &h88, &h48, &h49, &h89, &h4b, &h8b, &h8a, &h4a, &h4e, &h8e, &h8f, &h4f, &h8d, &h4d, &h4c, &h8c, &h44, &h84, &h85, &h45, &h87, &h47, &h46, &h86, &h82, &h42, &h43, &h83, &h41, &h81, &h80, &h40)

  end function


  以上程序在win98,vb6下調試通過。



作者blog:http://blog.csdn.net/huitiansou/
相關文章 字符串轉換成十六進制
vb下如何編寫crc校驗程序
md5加密算法在vb中的實現
md5算法實現
md5算法研究


收集最實用的網頁特效代碼!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗平县| 达尔| 班戈县| 宣汉县| 溆浦县| 九台市| 台州市| 昆山市| 理塘县| 阿拉善右旗| 兰西县| 友谊县| 关岭| 天柱县| 水富县| 吉首市| 饶河县| 侯马市| 大安市| 剑川县| 台山市| 鄱阳县| 简阳市| 湟源县| 阿拉善左旗| 黄山市| 淅川县| 崇文区| 鹰潭市| 宜兴市| 海林市| 朝阳区| 土默特左旗| 寿阳县| 邳州市| 石柱| 镇赉县| 海安县| 电白县| 盈江县| 额济纳旗|