修改后的CCITT CRC16算法

时间:2015-08-17 19:54:13

标签: c# vb.net algorithm crc crc16

我们一直在尝试与使用修改后的CCITT CRC16算法的设备进行通信。以下是手册中定义的示例

  

The polynomial for this algorithm is: X**16 + X**12 + X**5 + 1.

     

// --------------------------------------------- -------------------------------------------------- -------------------

     

一开始,

     
    

CRCLSB = 0FFH(八进制377)(十进制255)

         

CRCMSB = 0FFH(八进制377)(十进制255)

  
     

然后对于块中的每个数据字节

     
    

X = D XOR CRCMSB

         

X = X XOR(X>> 4)

         

CRCMSB = CRCLSB XOR(X>&gt; 3)XOR(X <&lt; 4)

         

CRCLSB = X XOR(X <&lt; <5)

  
     

最后

     
    

CRCLSB = CRCLSB XOR 0FFH

         

CRCMSB = CRCMSB XOR 0FFH

  
     

// --------------------------------------------- -------------------------------------------------- -------------------

我们有一个经过测试的片段

07 WLAD ID 123456 PL TEST PF TEST BD 1986/01/01 SX M LN LAB TS DIFF,1160000109,

(请参阅附件,因为数据包含特殊字符)

为此数据返回的校验和是C9BE。

有人可以帮助我们在VB.net或C#中实现此代码吗?

data_for_checksum.txt

更新 为迟到的回应道歉,

我们在VB.net中尝试了以下方法:添加一个文本框并获取值,但得到一个长十进制值:

Private Sub Button1_Click_dec(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Dim crclsb
    Dim crcmsb
    Dim a As Decimal

    crcmsb = 255
    crclsb = 255
    a = 255
    Dim d As Decimal
    Dim x As Decimal
    For i = 1 To Len(TextBox1.Text)
        'd = Asc(Mid(TextBox1.Text, i, 1))
        d = Mid(TextBox1.Text, i, 1)
        'd = Mid(TextBox1.Text, i, 1)
        x = d Xor crcmsb
        x = x Xor (x >> 4)
        crcmsb = crclsb Xor (x >> 3) Xor (x << 4)
        crclsb = x Xor (x << 5)



    Next
    'crclsb = Math.Abs(crclsb)
    crclsb = crclsb Xor a
    'crcmsb = Math.Abs(crcmsb)
    crcmsb = crcmsb Xor a
    Dim s
    Dim k
    s = Hex(crclsb)
    k = Hex(crcmsb)


    'C9BE
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim d As Byte
    Dim sstr ' As String

    sstr = TextBox1.Text.ToString
    'sstr = Convert.ToByte(sstr)
    'sstr = Replace(sstr, ", "")
    'crclsb = Convert.ToByte(255)
    'crcmsb = Convert.ToByte(255)
    'crclsb = &HFF
    'crcmsb = &HFF
    For i = 1 To Len(TextBox1.Text)
        Dim a As Byte
        a = Asc(Mid(TextBox1.Text, i, 1))
        d = Convert.ToByte(a)

        Call calc_crc(d)


    Next
    'Call calc_crc(sstr)
    Debug.Print(crcmsb)
    Debug.Print(crclsb)
End Sub

0 个答案:

没有答案