哪位大哥,能帮忙把下面的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,请大家帮忙了,很急,在线等。~~~~!
谢谢大家啦~~~~~~~~~~

解决方案 »

  1.   

    http://www.66study.com/Article/web/net/VB/200506/50336.html
      

  2.   

    <<是左位移运算,a<<n相当于a*2的n次方,a>>n是右位移,相当于a整除2的n次方
    ^是位异或运算,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,没有调试,希望对你有用
      

  3.   

    下面是copy的不知哪里的,楼主看看吧:
    =======================================
    计算法是依据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
      

  4.   

    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