十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
'Text1.Text 输入数据
兴城网站建设公司创新互联,兴城网站设计制作,有大型网站制作公司丰富经验。已为兴城上1000家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的兴城做网站的公司定做!
'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
CRC校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能。
可以对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准。
但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。
大概看了下。有变量定义类型错误,修改如下:
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校验类模块写好了再给你发过去。