哪位大哥,能帮忙把下面的C语言程序,改成VB的,
是CRC循环冗余码校验的一个函数,我看的不太明白。
unsigned int CRC_Check(unsigned char *ary,unsigned char len)
{
unsigned int crc;
unsigned char i,j;
crc=0xFFFF;
for(i=0;i<len;i++,ary++)
{
crc = ((unsigned int)*ary<<8)^crc;
for (j=0;j<8;j++)
{
if (crc&0x8000)
crc=(crc<<1)^0x1021;
else
crc<<=1;
} }
return (crc^0xFFFF);
}我不太懂VB,请大家帮忙了,很急,在线等。~~~~!
谢谢大家啦~~~~~~~~~~
是CRC循环冗余码校验的一个函数,我看的不太明白。
unsigned int CRC_Check(unsigned char *ary,unsigned char len)
{
unsigned int crc;
unsigned char i,j;
crc=0xFFFF;
for(i=0;i<len;i++,ary++)
{
crc = ((unsigned int)*ary<<8)^crc;
for (j=0;j<8;j++)
{
if (crc&0x8000)
crc=(crc<<1)^0x1021;
else
crc<<=1;
} }
return (crc^0xFFFF);
}我不太懂VB,请大家帮忙了,很急,在线等。~~~~!
谢谢大家啦~~~~~~~~~~
^是位异或运算,0^0=1^1=0,1^0=0^1=1
&是位与运算,除1&1=1外其余是0
|是位或运算,除0|0=0外其余是1
由于VB没有位运算,必须自己建立相应的函数,首先建立一个过程int2bin(是将一个整数转换成2进制数组),及函数bin2int(是将2进制数组转换成一个整数)以位与为例建立bitAnd函数
function bitAnd(a as integer,b as integer) as integer
dim aa(16) as integer,bb(16) as integer,cc(16) as integer
int2bin a,aa '将a转换成2进制数组aa
int2bin b,bb
for i=1 to 16
cc(i)=aa(i)*bb(i) '这是位与
'位或算法:cc(i)=max(a(i),b(i))
'位异或算法:cc(i)=(a(i)+b(i)) mod 2
next i
bitAnd=bit2int(cc) '将2进制数组cc转换成整数并返回
end function
手头上没有VB,没有调试,希望对你有用
=======================================
计算法是依据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
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