'Text1.Text 輸入數據
成都創新互聯是一家以網絡技術公司,為中小企業提供網站維護、成都網站制作、成都網站設計、網站備案、服務器租用、國際域名空間、軟件開發、成都小程序開發等企業互聯網相關業務,是一家有著豐富的互聯網運營推廣經驗的科技公司,有著多年的網站建站經驗,致力于幫助中小企業在互聯網讓打出自已的品牌和口碑,讓企業在互聯網上打開一個面向全國乃至全球的業務窗口:建站咨詢電話:18980820575
'Text2.Text 輸出數據
Dim ReturnData(1) As Byte
Private Sub Command1_Click()
Dim CRC(2) As Byte
Dim d(6) As Byte '待傳輸數據
ReDim data(7) As Byte
For i = 0 To 5
data(i) = "h" + Mid(Text1.Text, 2 * i + 1, 2)
Debug.Print data(i)
Next i
Call CRC16(data, UBound(data) - 2, data(6), data(7)) '調用CRC16計算函數
' CRC(0)為高位
' CRC(1)為低位
End Sub
Function CRC16(data() As Byte, i As Integer, ByRef ReturnDatalo As Byte, ByRef ReturnDatahi 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 Flag As Integer
CRC16Lo = HFF
CRC16Hi = HFF
CL = H1
CH = HA0
For i = 0 To UBound(data) - 2
CRC16Lo = CRC16Lo Xor data(i) '每一個數據與CRC寄存器進行異或
For Flag = 0 To 9
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
ReturnDatahi = CRC16Hi 'CRC高位
ReturnDatalo = CRC16Lo 'CRC低位
Debug.Print Hex(CRC16Lo), Hex(CRC16Hi)
Text2.Text = Text1.Text Hex(CRC16Lo) Hex(CRC16Hi)
End Function
Option Explicit On
Option Strict On
Imports System
Module Program
Sub Main()
Dim y,m,t As Integer
begin:
' 輸入數據時一行一個
y=CInt(Console.ReadLine())
m=CInt(Console.ReadLine())
t=CInt(Console.ReadLine())
If y
200 Then
Console.WriteLine("ERROR")
goto begin
End If
pr(y,m,t)
Console.Write("Press any key to continue . . . ")
Console.ReadKey(True)
End Sub
Function pr(y As Integer,m As Integer,t As Integer) As Integer
Dim ye,[Me],i As Integer
ye=CInt((m+t-2)/12+y)
[Me]=(m+t-2) Mod 12+1
End If
End Function
Function mday(y As Integer,m As Integer) As Integer
Dim day As Integer()={0,31,28,31,30,31,30,31,31,30,31,30,31}
Dim ad As I
VB 對位的操作是有點難度的!
VB 的CRC 校驗程序 請看下的URL!
VB下如何編寫CRC校驗程序
摘自于網絡
VB下如何編寫CRC校驗程序
隨著計算機技術的不斷發展,在現代工業中,利用微機進行數據通訊的工業控制應用得也越來越廣泛。由于傳輸距離、現場狀況等諸多可能出現的因素影響,計算機與受控設備之間的通訊數據常會發生無法預測的錯誤。為了防止錯誤所帶來的影響,一般在通訊時采取數據校驗的辦法,而循環冗余碼校驗是最常用的校驗方法之一。
一、循環冗余碼校驗原理
循環冗余碼校驗英文名稱為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下調試通過。
大概看了下。有變量定義類型錯誤,修改如下:
Public
Function
crc16(ByRef
cmdstring()
As
Byte,
DataLen
As
Integer)
As
String
Dim
data
As
Integer
Dim
i
As
Integer
Dim
CRCHi
As
long,
CRCLo
As
long'這里應該定義為long.因為下面賦值是long型。朋友。
Dim
iIndex
As
Long
Dim
CRCStr
As
String
Dim
DataStr
As
String
CRCLo
=
HFF'看這里的賦值。long型
CRCHi
=
HFF
For
i
=
To
DataLen
iIndex
=
CRCLo
Xor
cmdstring(i)
CRCLo
=
CRCHi
Xor
GetCRCLo(iIndex)
'低位處理
CRCHi
=
GetCRCHi(iIndex)
'高位處理
DataStr
=
DataStr
Chr(cmdstring(i))
Next
i
Dim
ReturnData(1)
As
Byte
ReturnData(1)
=
CRCHi
ReturnData(0)
=
CRCLo
CRCStr
=
StrConv(ReturnData,
vbUnicode)
crc16
=
DataStr
+
CRCStr
End
Function
異或在計算機二進制運算中是一種常用運算,最常見于數據的簡單加密。 它的運算規則是這樣的,兩組數據對位后進行比較——相同,即同為0或同為1,輸出0;不同,輸出1。 看下面的例子,你會掌握異或運算:(第一組數據) :0011 0011 0011 0011(第二組數據) :0000 1111 0011 1100(異或運算結果):0011 1100 0000 1111 ————————————————————————————————————我們先把校驗對象(31 30 34 32 H)劃成二進制:0011 0001 0011 0000 0011 0100 0011 0010 把校驗多項式(18 0D H)劃成二進制:0001 1000 0000 1101 據CRC12校驗規則,被除數為校驗對象后加12個“0”,除數為校驗多項式,運算時以高位對齊。以下使用計算法對校驗對象進行CRC12校驗。在每次計算前,高位去零,一直計算到被除數位數少于除數位數時停止。 計算過程:校驗對象: 0011 0001 0011 0000 0011 0100 0011 0010被除數 → 0011 0001 0011 0000 0011 0100 0011 0010 0000 0000 0000校驗多項式:0001 1000 0000 1101除數 → 1 1000 0000 1101 高位去零,對齊后進行異或運算: 110001001100000011010000110010000000000000
/1100000001101
=000001001010100011010000110010000000000000(高位去零,再次運算) 1001010100011010000110010000000000000
/1100000001101
=0101010101110010000110010000000000000(高位去零,再次運算) 101010101110010000110010000000000000
/1100000001101
=011010101000110000110010000000000000(高位去零,再次運算) 11010101000110000110010000000000000
/1100000001101
=00010101011100000110010000000000000(高位去零,再次運算) 10101011100000110010000000000000
/1100000001101
=01101011111010110010000000000000(高位去零,再次運算) 1101011111010110010000000000000
/1100000001101
=0001011110111110010000000000000(高位去零,再次運算) 1011110111110010000000000000
/1100000001101
=0111110110011010000000000000(高位去零,再次運算) 111110110011010000000000000
/1100000001101
=001110110101110000000000000(高位去零,再次運算) 1110110101110000000000000
/1100000001101
=0010110100011000000000000(高位去零,再次運算) 10110100011000000000000
/1100000001101
=01110100000010000000000(高位去零,再次運算) 1110100000010000000000
/1100000001101
=0010100001111000000000(高位去零,再次運算) 10100001111000000000
/1100000001101
=01100001100010000000(高位去零,再次運算) 1100001100010000000
/1100000001101
=0000001101111000000(高位去零,再次運算) 1101111000000
/1100000001101
=0001111001101(高位去零,符合終止條件)=1111001101 所以,CRC12校驗結果:11 1100 1101 →(十六進制)→ 3CDH————————————————————————————————————看你自己能不能理解,CRC12校驗類模塊寫好了再給你發過去。
public function Calculate_CRC8(byval crc as uint16,byval n as uint16) as uint16
dim i as uint16
crc=crc xor n
for i=0 to 7
if crc and 1 then
crc=(crc1) xor H8c
else
crc=crc1
end if
next
return crc
end function
文章標題:包含vb.netcrc的詞條
瀏覽地址:http://m.2m8n56k.cn/article38/hcecsp.html
成都網站建設公司_創新互聯,為您提供響應式網站、電子商務、移動網站建設、云服務器、企業網站制作、面包屑導航
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯