16,555
社区成员
发帖
与我相关
我的任务
分享
'CRC-16类代码
Imports System.Text
Public Enum CRCDataFormat As Integer
AsciiString = 0
BinaryString = 1
End Enum
''' <summary>
''' 16位CRC校验
''' </summary>
''' <remarks></remarks>
Public Class CRC16
''' <summary>
''' 计算法CRC-16
''' </summary>
''' <param name="Param">需要CRC校验的数据</param>
''' <param name="Polynomial">CRC多项式</param>
''' <returns>CRC校验值</returns>
''' <remarks></remarks>
Public Function CRC(ByVal Param As Byte(), ByVal Polynomial As UInt16) As UInt16
Dim uintCRC As UInt16 = CType(&HFFFF&, UInt16)
For i As Integer = 0 To Param.Length - 1
uintCRC = uintCRC Xor Param(i)
For j As Integer = 0 To 7
If (uintCRC And CType(&H1&, UInt16)) Then
uintCRC = (uintCRC >> 1) Xor Polynomial
Else
uintCRC = uintCRC >> 1
End If
Next
Next
Return uintCRC
End Function
''' <summary>
''' 计算法CRC-16
''' </summary>
''' <param name="Param"></param>
''' <param name="Polynomial"></param>
''' <param name="Format"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function CRC(ByVal Param As String, ByVal Polynomial As UInt16, Optional ByVal Format As CRCDataFormat = CRCDataFormat.AsciiString) As UInt16
If Format = CRCDataFormat.AsciiString Then
Return CRC(Encoding.Default.GetBytes(Param), Polynomial)
Else
Dim b(0) As Byte
For i As Integer = 0 To Param.Length - 1 Step 2
Dim a As String = Mid(Param, i + 1, 2)
ReDim Preserve b(i / 2)
b(i / 2) = Convert.ToInt16(a, 16)
Next
Return CRC(b, Polynomial)
End If
End Function
End Class
'调用部分代码
Dim a As New CRC16
Debug.WriteLine(a.CRC("123456789", CType(&H8005&, UInt16)).ToString("X4"))
''' <summary>
''' 计算法CRC-16
''' </summary>
''' <param name="Param">需要CRC校验的数据</param>
''' <param name="Polynomial">CRC多项式</param>
''' <returns>CRC校验值</returns>
''' <remarks>多项式采用0xA001为Normal/Reversed/Reverse of Reciprocal中的Reversed。采用多项式0xA001则处理结果同查表法结果。</remarks>
Public Function CRC(ByVal Param As Byte(), ByVal Polynomial As UInt16) As UInt16
Dim uintCRC As UInt16 = CType(&H0&, UInt16)
Dim uintData As UInt16
For i As Integer = 0 To Param.Length - 1
uintData = Param(i)
For j As Integer = 0 To 7
If ((uintCRC Xor uintData) And &H1&) = &H1& Then
uintCRC = (uintCRC >> 1) Xor Polynomial
Else
uintCRC >>= 1
End If
uintData >>= 1
Next
Next
Return uintCRC
End Function