VB 的CRC16校正演算法 )

來源:互聯網
上載者:User

'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

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.