VB 的CRC16校验算法 (转)

'Data为字符型数组 start为开始点 size 为几个,返回的即为 CRC
Public Function CRC16(Data() As Byte, start As Integer, size As Integer) As Long
    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 size - 1
        CRC16Lo = CRC16Lo Xor Data(start + 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
    CRC16 = CRC16Hi               'CRC高位
    CRC16 = CRC16 * 256
    CRC16 = CRC16 + CRC16Lo            'CRC低位
End Function


 

查表法:

Private Sub CRC16(data() As Byte)
    Dim CRC16Hi As Byte
    Dim CRC16Lo As Byte
    ReDim ReturnData(2) 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 GetCRCHi(iIndex)             '低位处理
        CRC16Hi = GetCRCLo(iIndex)                         '高位处理
    Next i

    ReturnData(0) = CRC16Hi                                'CRC高位
    ReturnData(1) = CRC16Lo                                'CRC低位

    '    For i = 0 To UBound(ReturnData)
    '        Text9.Text = Text9.Text & Hex(ReturnData(i))
    '    Next i
    Text7.Text = Hex(ReturnData(1))
    Text8.Text = Hex(ReturnData(0))
    Text9.Text = Hex(ReturnData(1)) & Hex(ReturnData(0))
End Sub

'CRC低位字节值表
    Function GetCRCLo(Ind As Long) As Byte
    GetCRCLo = 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

'CRC高位字节值表
    Function GetCRCHi(Ind As Long) As Byte
    GetCRCHi = 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

 

 

 

转载于:https://www.cnblogs.com/Godblessyou/archive/2009/07/10/1520271.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值