CRC-16 问题,麻烦进来看看

iwome 2010-04-09 05:09:14
'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"))


我这个代码是从网上C代码转的,想做标准CRC-16校验,其中查表法已经没有问题了。但是这个直接计算的办法始终不正确,网上代码参差不齐。

所以麻烦给看看问题在哪里。

其中“123456789”的CRC-16数据为 “BB3D”
而我这个算出来的是“3D7B”
另使用多项式为 A001,1021,8408亦对不上。
...全文
250 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwome 2010-04-17
  • 打赏
  • 举报
回复

http://download.csdn.net/source/2250829

整理完毕,资源上传,CRC-16,CRC-32 查表法与计算法源码,并一个串口简单处理类。

欢迎多多下载。
iwome 2010-04-17
  • 打赏
  • 举报
回复
    ''' <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

搞定,结贴。
iwome 2010-04-14
  • 打赏
  • 举报
回复

顶一下,谁给看看。
兔子-顾问 2010-04-12
  • 打赏
  • 举报
回复
不知道哪个是对的,我自己的crc16计算结果不是你给的这2个中的任何一个。
iwome 2010-04-12
  • 打赏
  • 举报
回复

顶一下了,谁知道给看看啊。

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧