zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Objective-C 学习记录--toches、Motion/Size/Rect/Point/CGFloat/protocol
    Objective-C 学习记录6--dictionary
    Objc基础学习记录5
    第四篇:web之前端之jquery
    第三篇:web之前端之JavaScript基础
    第二篇:web之前端之css
    第一篇:web之前端之html
    第三篇:杂项之年终总结
    第二篇:杂项之图像处理pillow
    第一篇:杂项之pymysql连接池
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/1520271.html
Copyright © 2011-2022 走看看