搜索
bottom↓
回复: 16

[上位机]公布一个计算CRC16的dll,使用VB做范例

[复制链接]

出0入296汤圆

发表于 2008-7-29 23:44:38 | 显示全部楼层 |阅读模式
最近需要计算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, 杜汶泽)

出0入0汤圆

发表于 2009-6-14 10:06:18 | 显示全部楼层
谢谢!太好了!

出0入0汤圆

发表于 2009-9-11 12:34:53 | 显示全部楼层
CRC算法有:CRC16,CRC32,CRC CCIT
不知道楼主是哪种算法

出0入0汤圆

发表于 2009-9-12 15:46:44 | 显示全部楼层
楼上的问题真是笑死人。

出0入0汤圆

发表于 2010-3-18 00:23:58 | 显示全部楼层
额,谢谢楼上的大哥了啊,小弟受教了,呵呵。

出0入0汤圆

发表于 2010-3-20 08:16:32 | 显示全部楼层
谢了

出0入0汤圆

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



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



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

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

出0入296汤圆

 楼主| 发表于 2010-5-25 21:41:37 | 显示全部楼层
to 【6楼】 livi  
    参照2楼问题

出0入0汤圆

发表于 2010-7-21 07:42:23 | 显示全部楼层
正在学习

出0入0汤圆

发表于 2010-12-28 18:15:34 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-2-10 11:22:04 | 显示全部楼层
找对地方就好找:)
我是直接从linux内核源码中拷出来用的。
封装了更好。

出0入0汤圆

发表于 2011-2-10 11:25:19 | 显示全部楼层
2楼让我想起语文书上的一句:茴香豆有哪4种写法?

出0入0汤圆

发表于 2011-2-10 13:32:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-17 15:38:31 | 显示全部楼层
牛!

出0入0汤圆

发表于 2011-5-24 09:12:00 | 显示全部楼层
我也用公式算了,值根本就不对么

出0入0汤圆

发表于 2011-7-12 15:55:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-14 13:46:31 | 显示全部楼层
楼主威武,我刚开始学delphi,这里不错,今后常驻了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表