|
最近需要计算CRC16的十六进制字符串,从网上找了很多,都无法使用,很郁闷,就自己写了一个
Dll,并改造了一个VB的工程——感谢VB工程的原作者。
点击此处下载 ourdev_362292.rar(文件大小:21K) (原文件名:CRC16_vb计算器.rar)
在VB中传递数组给动态链接库的方法
由于VB中的数组实际上是一个名叫SAFEARRAY的结构体,因此无法直接利用在VB中函数间传递数组
的方法。实际上在结构体SAFEARRAY中,有一个指向实际数组的指针。我们需要的就是这个指针。我们
都知道,数组元素的第一个字节所在的地址一定和数组的首地址是相同的,因此,我们在函数声明的
时候,要求调用者传递一个XX类型的指针过去,而调用者只需要把第一个元素的首地址传递过去,就
可以获得我们需要的数组首地址。
比如,已知一个Byte型的数组Buffer,其中保存了要进行CRC计算的数据:
Dim Buffer(0 To 8) As Byte
Buffer(0) = &H1B
Buffer(1) = &H9
Buffer(2) = &H0
Buffer(3) = &H1
Buffer(4) = &H0
Buffer(5) = &H0
Buffer(6) = &H0
Buffer(7) = &HE
Buffer(8) = &H1
MsgBox (Hex(Check_CRC16(Buffer(0), 9)))
'这里HEX()是一个函数,将数值转换为对应的16进制字符串,当然,不含有“0x”。
CRC16.bas
Public Declare Function Check_CRC16 Lib "CRC.dll" (ByRef pchData As Byte, ByVal nLength As Integer) As Integer
CRC.c
UINT16 __stdcall Check_CRC16(BYTE *pchData,INT32 lLength)
{
UINT16 wCRC = CRC_INIT;
while(lLength--)
{
BYTE chData = *pchData++;
chData ^= (UINT8)((UINT16)wCRC & 0x00FF);
chData ^= chData << 4;
wCRC = ((((UINT16)chData << 8) | (wCRC >> 8)) ^ (UINT8)(chData >> 4)
^ ((UINT16)chData << 3));
}
return wCRC;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|