史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > Hacker/Cracker 及加解密技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-06-04, 09:40 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 軟體 - VB下如何編寫CRC校驗程式

VB下如何編寫CRC校驗程式
作者: 欒金奎

網網頁面地址是:http://www.mf100.com.com/document/2005-5/454.shtml
--------------------------------------------------------------------------------



VB下如何編寫CRC校驗程式

  隨著電腦技術的不斷發展,在現代工業中,利用微機進行資料通訊的工業控制應用得也越來越廣泛。由於傳輸距離、現場狀況等諸多可能出現的因素影響,電腦與受控設備之間的通訊資料常會發生無法預測的錯誤。為了防止錯誤所帶來的影響,一般在通訊時採取資料校驗的辦法,而循環冗余碼校驗是最常用的校驗方法之一。

crc通常是利用一個或多個bit來作錯誤更正的動作
傳送前,把每個bit加起來, 加上crc bit, 要讓它剛好是奇數或是偶數
接收到以後, 把每個bit加起來, 若不是原來的奇數或偶數, 那代表有問題

不過1個bit只能找出一個或是奇數個錯誤, 若偶數個將會無法發現
越多bit的檢查越能更正錯誤, 甚至還可以自動找出哪個bit有問題
這樣就不需要要求重送


這個東西通常用在像是rs232或是資訊傳輸的錯誤更正和發現
之前我幫人作過家電控制時有實作過, 不過現在程式不見了
以下的連結給您參考看看

http://www.slavasoft.com/fastcrc/#1

這一頁有答案, 和crc16,crc32的做法, 有現成物件可以抓來用


那CRC16校驗碼可以用來作十進位數位轉換成十六進位數位後
檢查轉換後的數位.確定ok,然後輸出
還是只能作RS232資料傳輸的偵測校驗
16進位和10進位不都是數位?
祇是表現方式不同而已哩
就是都直接當作參數輸入就對了

只不過, 這東西主要是用來檢查各種傳輸的結果正確與否
單機內的運算不用這麼麻煩啦

SlavaSoft FastCRC Library
HIGHLY OPTIMIZED CRC LIBRARY
A highly optimized implementation of the most popular CRC algorithms.

The library allows Windows developers to perform checksum calculations for memory blocks, strings, blobs, streaming data and files in their applications.

FastCRC Library was designed to be fast, flexible and extremely easy to use.
Major Features:

Support of

3 checksum algorithms: CRC16, CRC16C (CRC-CCITT), CRC32.

Support of 3 interfaces:

FastCRC API (The FastCRC API can be used as is, or it can be used to create wrappers for other languages that use DLLs).

C++ Interface (C++ wrapper classes to FastCRC API).

FastCRC Type Library (Includes all declarations for accessing the FastCRC Library from different programming languages which have the possibility to reference a Type Library, such as VB 5.0, VB 6.0, VBA, etc.)

Support for

Static Linking

Dynamic Linking

No external dependencies such as MFC DLLs, COM/DCOM or other resources.

Excellent documentation (MFC-style help).

Details:

The fastcrc.zip file that you download contains the following files:

FastCRC.h - include file
FastCRCS.lib - LIB file for static linking to FastCRC Library
FastCRC.lib - LIB file for dynamic linking to FastCRC Library
FastCRC.dll - DLL file
FastCRC.tlb - Type Library for FastCRC.dll
FastCRC.chm - HTML help file for FastCRC Library
ReadMe.txt - brief FastCRC Library description
Register.exe - registration program for SlavaSoft products

Samples:

Some samples are listed in the table below. More samples can be found in FastCRC Library's help file (FastCRC.chm).
C++ Interface Examples
String checksum generation using the CRC16 checksum algorithm

File checksum generation using the CRC32 checksum algorithm

FastCRC API Examples ( C )
String checksum generation using the CRC16 checksum algorithm

File checksum generation using the CRC32 checksum algorithm

FastCRC Type Library Examples ( Visual Basic )
String checksum generation using the CRC16 checksum algorithm

File checksum generation using the CRC32 checksum algorithm
http://www.slavasoft.com/fastcrc/sam...mplestring.htm
http://www.slavasoft.com/fastcrc/sam...mplestring.htm
http://www.slavasoft.com/fastcrc/sam...samplefile.htm
Cyclic Redundancy Checksum (CRC) 功能是自動校正錯誤
用在電子電路或是資料通訊傳輸上可以避免資料錯誤
既然您找到這段程式 我想您應該可以找的到更好的.....

一、 循環冗余碼校驗原理

  循環冗余碼校驗英文名稱為Cyclical Redundancy Check,簡稱CRC。它是利用除法及餘數的原理來作錯誤偵測(Error Detecting)的。實際應用時,發送裝置計算出CRC值並隨資料一同發送給接收裝置,接收裝置對收到的資料重新計算CRC並與收到的CRC相比較,若兩個CRC值不同,則說明資料通訊出現錯誤。
根據應用環境與習慣的不同,CRC又可分為以下幾種標準:
  1CRC-12碼;
  2CRC-16碼;
  3CRC-CCITT碼;
  4CRC-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, &HDA, &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下除錯通過。

此帖於 2006-06-04 09:59 PM 被 psac 編輯.
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 10:42 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1