我们一直在尝试与使用修改后的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#中实现此代码吗?
更新 为迟到的回应道歉,
我们在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