0

参考此链接 Calculate CRC32 of an String or Byte Array 我修改了代码以计算CRC16而不是CRC32,但是我得到了错误的结果,有人能指出错误在哪里吗?

Private Sub Main()
Crc16.ComputeChecksum(Encoding.UTF8.GetBytes("Some string"))
End Sub
    Public Class CRC16
Shared table As UShort()

Shared Sub New()
    Dim poly As UShort = &HA001US 'calculates CRC-16 using A001 polynomial (modbus)
    table = New UShort(255) {}
    Dim temp As UShort = 0
    For i As UShort = 0 To table.Length - 1
        temp = i
        For j As Integer = 8 To 1 Step -1
            If (temp And 1) = 1 Then
                temp = CUShort((temp >> 1) Xor poly)
            Else
                temp >>= 1
            End If
        Next
        table(i) = temp
    Next
End Sub

Public Shared Function ComputeChecksum(ByVal bytes As Byte()) As UShort
    Dim crc As UShort = &H0US ' The calculation start with 0x00
    For i As Integer = 0 To bytes.Length - 1
        Dim index As Byte = CByte(((crc) And &HFF) Xor bytes(i))
        crc = CUShort((crc >> 8) Xor table(index))
    Next
    Return Not crc
End Function
End Class
4

2 回答 2

1

试试这个,它是用于仪器控制的 VB6 代码。(sCommand 是一个包含所有字节的临时字符串,Result 被添加到 sCommand,Modbus 首先使用 LSB,TextToString 和 StringToAscii 是将可读字符串“FF EE”转换为 ASCII 并返回的函数,因此它们在这里不感兴趣。 ):

Private Sub cmdCRC16_Click()
Dim sCommand As String
Dim x As Long
Dim y As Long
Dim lCRC As Long
sCommand = TextToString(txtASCII)
'Initial value
lCRC = 65535 '(&HFFFF results in Integer -1)
For x = 1 To Len(sCommand)
    lCRC = lCRC Xor Asc(Mid(sCommand, x, 1))
    For y = 1 To 8
        If (lCRC Mod 2) > 0 Then
            lCRC = (lCRC And 65534) / 2
            lCRC = lCRC Xor 40961 '(&HA001 results in whatever negative integer)
        Else
            lCRC = (lCRC And 65534) / 2
        End If
    Next y
Next x
'Add CRC with LSB first
sCommand = sCommand + Chr(lCRC And 255)
sCommand = sCommand + Chr((lCRC And 65280) / 256)
txtASCII = StringToASCII(sCommand)

结束子

于 2014-10-28T13:30:17.243 回答
0

我刚遇到同样的问题。简单的解决方案是在最后省略否定,所以只需将“Return Not crc”更改为“Return crc”就可以了。

CRC-16 有多种变体,其中“CRC-16”通常是指 IBM 变体,也称为“ARC”。它使用零的 XorOut 值。请参阅16 位参数化 CRC 算法目录

于 2017-02-24T20:56:47.850 回答