注册 登录
编程论坛 VB6论坛

VB 进行32位 CRC校验 如何定义无符号LONG型变量 或则有什么变通方式?

huihao5716 发布于 2018-04-11 17:03, 3221 次点击
各位大神,本人从事嵌入式软件开发,工作中用到了VB开发一个小工具,需要进行32位CRC校验,苦于VB无法定义无符号类型,希望各位大神经验,小弟不胜感激!
C语言有实现,需要在VB 中实现。。。

  u32 User_Make_crc32(u32 crc, u8* buf, u32 len)
4 回复
#2
风吹过b2018-04-12 10:07
只要不涉及到 四则运算,就直接用 long ,不用管是否在符号位。

VB6没有左移命令和右移命令,倒是一个很烦的事。随手写了一点代码,自己多调试一下看看。

程序代码:
Public Function 左移1位(x As Long) As Long
Dim y As Long
y = x And &H40000000        '保存次高位
x = x And &H3FFFFFFF        '最高和次高位置0
x = x * 2                   '左移1位        '最高位和次高位置0是防止这步溢出
'
移几位是相当于乘 2^(N-1)
If y > 0 Then '次高位需要变到最高位去,只有二种情况,一种=0,一种=&H40000000
    x = x Or &H80000000
End If   
    左移1位 = x
End Function

Public Function 右移1位(x As Long) As Long
Dim y As Long
y = x And &H80000000            '保存最高位
If y < 0 Then                   'X为负数,运算前要把符号位干掉
  x = x And &H7FFFFFFF
End If
x = Int(x / 2)                  '没去测试不使用int函数会不会正确。调用函数开销很大。
If y < 0 Then                   '最高位不为零,则放到次高位上去
    x = x Or &H40000000
End If
右移1位 = x
End Function
#3
风吹过b2018-04-12 10:13
还想到一种移位方法,全部拆成位,保存到数组里,
然后移动数组元素位置。
最后再组合起来。
只使用 位操作 + 循环 ,赋值 命令,不需要四则运算。
对于多位移动可能更快一点,没去写代码。

#4
风吹过b2018-04-12 15:22
If y < 0 Then                   'X为负数,运算前要把符号位干掉
  x = x And &H7FFFFFFF
End If
x = Int(x / 2)                  '没去测试不使用int函数会不会正确。调用函数开销很大。

换成
x= (x And &H7FFFFFFE)/2        '最高位已保存了,所以不用管,直接去掉。同时把最低位置0 ,最低位在向右移时,会被丢失
                               '最低位置零时,被2除时一定能整除,不需要再考虑整除问题

代码执行效率优化真的很难很难想。
#5
huihao57162018-05-12 13:47
回复 3楼 风吹过b
最近没有登录,感谢版主!中心思想是对的,不用管最高位符号位的,直接计算。
1