Gorgon_Meducer 发表于 2008-7-29 23:44:38

[上位机]公布一个计算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;
}

z_zt 发表于 2009-6-14 10:06:18

谢谢!太好了!

whuctx 发表于 2009-9-11 12:34:53

CRC算法有:CRC16,CRC32,CRC CCIT
不知道楼主是哪种算法

flyunlimit 发表于 2009-9-12 15:46:44

楼上的问题真是笑死人。

sunjie718 发表于 2010-3-18 00:23:58

额,谢谢楼上的大哥了啊,小弟受教了,呵呵。

liubinghui 发表于 2010-3-20 08:16:32

谢了

livi 发表于 2010-5-25 21:34:50

回复【楼主位】Gorgon Meducer 傻孩子
    最近需要计算crc16的十六进制字符串,从网上找了很多,都无法使用,很郁闷,就自己写了一个
dll,并改造了一个vb的工程——感谢vb工程的原作者。
点击此处下载(原文件名:crc16_vb计算器.rar)


在vb中传递数组给动态链接库的方法


    由于vb中的数组实际上是一个名叫safearray的结构体,因此无法直接利用在vb中函数间传递数组
的方法。实际上在结构体safearray中,有一个指向实际数组的指针。我们需要的就是这个指针。我们
都知道,数组元素的第一个字节所在的地址一定和数组的首地址是相同的,因此,我们在函数声明的
时候,要求调用者传递一个xx类型的指针过去,而调用者只需要把第一个元素的首地址传递过去,就
可以获......
-----------------------------------------------------------------------

首先谢谢你的共享,但是计算结果好象是不对的!

Gorgon_Meducer 发表于 2010-5-25 21:41:37

to 【6楼】 livi
    参照2楼问题

tom030704 发表于 2010-7-21 07:42:23

正在学习

hdd961140543 发表于 2010-12-28 18:15:34

mark!

fascism 发表于 2011-2-10 11:22:04

找对地方就好找:)
我是直接从linux内核源码中拷出来用的。
封装了更好。

fascism 发表于 2011-2-10 11:25:19

2楼让我想起语文书上的一句:茴香豆有哪4种写法?

dogbush 发表于 2011-2-10 13:32:11

mark

haolaishi 发表于 2011-5-17 15:38:31

牛!

sjh00213 发表于 2011-5-24 09:12:00

我也用公式算了,值根本就不对么

ldj7501 发表于 2011-7-12 15:55:55

mark

inmoney 发表于 2011-7-14 13:46:31

楼主威武,我刚开始学delphi,这里不错,今后常驻了!
页: [1]
查看完整版本: [上位机]公布一个计算CRC16的dll,使用VB做范例