*是指针,应该使用ByRef修饰Public Declare Function GetMac Lib "d:\btoc\sldes.dll" (ByRef buf As Byte, ByVal buf_len As Long, ByVal MacKey As String, ByVal mac As String) As LongPublic Declare Function ConvertPwd Lib "sldes.dll" (ByRef Source As Byte, ByRef dest As Byte, ByRef workkwy As Byte, ByVal flag As Byte) As Long
有三种情况
一、字符串,那定义为ByVal …… as String
二、单字节数据,ByRef …… As Byte
三、数据缓冲区:有三种声明方式:
ByRef …… as Byte:Byte数据流,调用:Bytes数组(最小下标)
ByVal …… As Long:直接设置地址(注:用VarPtr可以得到变量的地址)
…… As Any:最灵活的形式你的MacKey、mac具体是什么数据?
数据长度?
2、Public Declare Function ConvertPwd Lib "sldes.dll" (ByVal Source As string, ByVal dest As Byte, ByVal workkwy As Byte, ByVal flag As Byte) As Long指针参数可以byval,这样系统将把地址指针赋给字符串或数组变量。
记住,VB中只有字符串或数组变量是通过指针引用的。
ByRef bytAryMacKey As Byte, ByRef bytAryMac As Byte) As LongPublic Declare Function ApiConvertPwd Lib "xxx.dll" Alias "ConvertPwd" (ByRef bytArySource As Byte, ByRef bytAryDest As Byte, _
ByRef bytAryKey As Byte, ByVal bytFlg As Byte) As Long
在调用时遇到bytAry...开头的变量时用Byte型的数组,传递参数时用数组的第一个元素即可。
长度为422位的包文(字符串),经过加密的
除去Mac长度为16位和Track(磁道信息)160位外剩下244位
起先我得使用函数:(把整个包文解密)
GetMac(数据源,数据源长度=244,得到的Mac密钥值,生成的Mac包文);
再在生成的Mac包文中取出16位经过Des加密后的密文用函数:(把包文中的密码一项解密)
ConvertPwd(16位密码,解密后的数据(明码),从上面函数中得的Mac密钥值,"d");
在这里我碰到这样的问题:
我的数据源得来应该是字符串(VB中的string),生成的244位Mac包文也应该是字符串,这样我才能用mid(Mac包文,160,16)取出16位密码,再解密得到明码也是字符串。
现在定义成byte型,本人还有点搞不懂,所以还请各位能否说明一下上面我说的过程。
dim sourStr() as byte
dim mackey() as byte
dim objeStr() as byte
dim errsucc as longerrsucc=GetMac(sourStr,244,mackey,objeStr)'是这样吗?
那我怎么取244位的数据的几位呢???
你的VC++函数最好有一对(字符vs十六进制字符串)转换函数,你来回传递的都是“08BF9312”之类的串。当然这样串长度会增加一倍,但是避开了Unicode问题。
否则,你必须使用byte数组,用传址方式。
在VB中调用时,引用数组的首单元。
这两种方式我都用过。目前我用的dll库两种都有。
Public Declare Function GetMac Lib "sldes.dll" (ByRef buf As Byte, ByVal buf_len As Long, ByRef mackey As Byte, ByRef mac As Byte) As Long
在调用时写成这样???:
dim strfrom(2) as byte
dim sourStr(2) as byte
dim mackey(2) as byte
dim objeStr(2) as byte
dim errsucc as longwinsock1.getdata strfrom(0)
errsucc=GetMac(strfrom(0),244,mackey(0),objestr(0))???
这又是为什么啊??