[上位机]公布一个计算CRC16的dll,使用VB做范例
最近需要计算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;
} 谢谢!太好了! CRC算法有:CRC16,CRC32,CRC CCIT
不知道楼主是哪种算法 楼上的问题真是笑死人。 额,谢谢楼上的大哥了啊,小弟受教了,呵呵。 谢了 回复【楼主位】Gorgon Meducer 傻孩子
最近需要计算crc16的十六进制字符串,从网上找了很多,都无法使用,很郁闷,就自己写了一个
dll,并改造了一个vb的工程——感谢vb工程的原作者。
点击此处下载(原文件名:crc16_vb计算器.rar)
在vb中传递数组给动态链接库的方法
由于vb中的数组实际上是一个名叫safearray的结构体,因此无法直接利用在vb中函数间传递数组
的方法。实际上在结构体safearray中,有一个指向实际数组的指针。我们需要的就是这个指针。我们
都知道,数组元素的第一个字节所在的地址一定和数组的首地址是相同的,因此,我们在函数声明的
时候,要求调用者传递一个xx类型的指针过去,而调用者只需要把第一个元素的首地址传递过去,就
可以获......
-----------------------------------------------------------------------
首先谢谢你的共享,但是计算结果好象是不对的! to 【6楼】 livi
参照2楼问题 正在学习 mark! 找对地方就好找:)
我是直接从linux内核源码中拷出来用的。
封装了更好。 2楼让我想起语文书上的一句:茴香豆有哪4种写法? mark 牛! 我也用公式算了,值根本就不对么 mark 楼主威武,我刚开始学delphi,这里不错,今后常驻了!
页:
[1]