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

  • 相关阅读:
    二叉排序树
    索引顺序表查找(分块查找)
    wpf中的窗口
    递归算法以及汉诺塔
    Net中资源存储的设置
    AutoResetEvent 和ManualResetEvent
    WPF:跨应用程序会话保持和还原应用程序范围的属性
    Base64编码及其作用
    WPF中的应用程序级别Application
    Ajax经典学习教材,IBM官方Ajax教材
  • 原文地址:https://www.cnblogs.com/Godblessyou/p/1520271.html
Copyright © 2011-2022 走看看