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/p/1520271.html