VB 6.0和VB.NET 2005实现CRC算法在位运算及数据类型方面的差异

项目要用到CRC校验,和硬件设备进行串口通信

原本做硬件部分的开发团队用VB6写过一个CRC算法,我们开始的时候就按照VB的代码直接翻译过来,发现校验总是通不过

后来注意到VB6和VB.NET的数据类型不一致(之前没用过VB6),于是在VB.NET代码中就修正数据类型为Short

发现得到的结果还是不对,而且会发生数据溢出错误

找了两三天,到最后安装上VS 6.0运行原来的VB6程序,一步步跟踪比较两个程序的差异

才发现算法中有一个Xor操作的结果超出VB.NET中Short数据类型的最大值(对应VB6中Integer类型)

而在VB6中却没有类似问题

应该是Xor操作的结果是整型的,在VB6中刚好16位没问题,而在VB.NET中还按整型处理就是一个大于32767的数,而不是意想中的表示成负数的Short类型

最后的处理方法是首先用整型的数值获得Xor操作的结果,判断如果不大于32767就直接赋值给Short型变量,否则变成负数(减去65536)后赋值给Short型变量

搞定,^_^