CRC16 验证 谁能把这个C代码转成VB的

syler666 2017-01-19 09:10:04
/*CRC-16效验函数
多项式为X^16+X^15+X^2+1
CRC_RESULT为全局变量,是计算结果结果,可能有上次计算的结果在
*/
unsigned int CRC_16(unsigned char *str,int lenth)
{
unsigned char k;
unsigned long temp=0;
while(lenth--)
{
for(k=0x80;k!=0;k=k>>1)
{
temp=temp*2;
if((temp&0x10000)!=0)
temp=temp^0x18005;
if((*str & k)!=0)
temp=temp^(0x10000^0x18005);
}
str++;
}
return temp;

}


以上为C的码

55 13 85 67 AD 65 CRC校验后 :B3DC

或者把这个C代码封装成DLL 我使用VB调用 谢谢
...全文
136 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2017-01-20
  • 打赏
  • 举报
回复
按照C代码的流程,直接“翻译”的。 用你给的这组数据测试,结果没什么问题,你如果“看懂了”可以考虑优化一下。
Option Explicit

Private Function CRC_16(aBuff() As Byte, ByVal lenth As Long) As Integer
   Dim k As Long
   Dim temp As Long
   Dim p As Long

   temp = 0
   p = LBound(aBuff)
   Do While (lenth > 0)
      lenth = lenth - 1
      k = 128
      Do
         If (k = 0) Then Exit Do
         temp = temp + temp
         If ((temp And &H10000) <> 0) Then temp = temp Xor &H18005
         If ((aBuff(p) And k) <> 0) Then temp = temp Xor &H8005&
         k = k \ 2
      Loop
      p = 1& + p
   Loop
   If ((temp And &H8000) = 0) Then
      temp = temp And &H7FFF&
   Else
      temp = temp Or &HFFFF8000
   End If
   CRC_16 = temp
End Function

Private Sub Command1_Click()
   Dim arrTest()  As Byte
   '55 13 85 67 AD 65   CRC校验后 :B3DC
   ReDim arrTest(5)
   arrTest(0) = &H55
   arrTest(1) = &H13
   arrTest(2) = &H85
   arrTest(3) = &H67
   arrTest(4) = &HAD
   arrTest(5) = &H65

   MsgBox Hex$(CRC_16(arrTest, 6)), 64
End Sub
syler666 2017-01-20
  • 打赏
  • 举报
回复
Chen8013 100分感谢。

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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