'**** 代码开始 ****
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Function AsmCrc(bytInput() As Byte, ByVal Init As Long) As Long
Dim Asm(5) As Long
Asm(0) = &H5B5A5958
Asm(1) = &HC033505E
Asm(2) = &H3018A36
Asm(3) = &H41CED1F0
Asm(4) = &HF47ECA3B
Asm(5) = &HC3338936
CallWindowProc VarPtr(Asm(0)), _
VarPtr(bytInput(LBound(bytInput))), _
VarPtr(bytInput(UBound(bytInput))), _
VarPtr(AsmCrc), _
Init
End Function
'**** 没有了 ****没有使用方法的代码。我试着写了一个,不知道这么用对不对:
Private Sub Command1_Click()
Dim myBAry() As Byte
Dim myL As Long myBAry = StrConv(Text1.Text, vbFromUnicode) myL = AsmCrc(myBAry, Len(Text1.Text))
Debug.Print "字符串“" & Text1.Text & "”的CRC校验:" & myL
End Sub如果把 AsmCrc 的 Init 参数设定成其他的长整数,AsmCrc 的返回值也发生变化。哪位知道用法?
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Function AsmCrc(bytInput() As Byte, ByVal Init As Long) As Long
Dim Asm(5) As Long
Asm(0) = &H5B5A5958
Asm(1) = &HC033505E
Asm(2) = &H3018A36
Asm(3) = &H41CED1F0
Asm(4) = &HF47ECA3B
Asm(5) = &HC3338936
CallWindowProc VarPtr(Asm(0)), _
VarPtr(bytInput(LBound(bytInput))), _
VarPtr(bytInput(UBound(bytInput))), _
VarPtr(AsmCrc), _
Init
End Function
'**** 没有了 ****没有使用方法的代码。我试着写了一个,不知道这么用对不对:
Private Sub Command1_Click()
Dim myBAry() As Byte
Dim myL As Long myBAry = StrConv(Text1.Text, vbFromUnicode) myL = AsmCrc(myBAry, Len(Text1.Text))
Debug.Print "字符串“" & Text1.Text & "”的CRC校验:" & myL
End Sub如果把 AsmCrc 的 Init 参数设定成其他的长整数,AsmCrc 的返回值也发生变化。哪位知道用法?
Option Explicit' This code is taken from the VB.NET CRC32 algorithm
' provided by Paul ([email protected]) - Excellent work!Private crc32Table() As LongPublic Function GetByteArrayCrc32(ByRef buffer() As Byte) As Long
Dim crc32Result As Long
crc32Result = &HFFFFFFFF
Dim i As Integer
Dim iLookup As Integer
For i = LBound(buffer) To UBound(buffer)
iLookup = (crc32Result And &HFF) Xor buffer(i)
crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And 16777215 ' nasty shr 8 with vb :/
crc32Result = crc32Result Xor crc32Table(iLookup)
Next i
GetByteArrayCrc32 = Not (crc32Result)End Function
Private Sub Class_initialize() ' This is the official polynomial used by CRC32 in PKZip.
' Often the polynomial is shown reversed (04C11DB7).
Dim dwPolynomial As Long
dwPolynomial = &HEDB88320
Dim i As Integer, j As Integer ReDim crc32Table(256)
Dim dwCrc As Long For i = 0 To 255
dwCrc = i
For j = 8 To 1 Step -1
If (dwCrc And 1) Then
dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
dwCrc = dwCrc Xor dwPolynomial
Else
dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
End If
Next j
crc32Table(i) = dwCrc
Next iEnd Sub
能请教VB+汇编的代码应该怎么使用?ByVal Init As Long的参数是什么意思?
另外
CallWindowProc函数
参数: 意义
lpPrevWndFunc Long,原来的窗口过程地址 HWnd Long,窗口句柄 Msg Long,发送的消息
wParam Long,消息类型,参考wParam参数表
lParam Long,依据wParam参数的不同而不同
返回值 Long,依据发送的消息不同而变化
如果只调用一次AsmCrc,应该Init =0
如果循环调用,可能是下面这么用dim lngInit as long,lngResult as long
dim i as long
dim inputdata() as byte
lngInit=0
for i=0 to ...
getdata(inputdata)
lngResult=AsmCrc(inputdata,lngInit)
lngInit=lngResult
next
debug.? lngResult猜的,呵呵
>init在这里按值传递给AsmCrc调用 参数声明是:ByVal Init As Long,当然是“按值”传递啦!这连菜鸟都知道。
我的问题是应该传递什么值。To yachong(蚜虫) :
这样循环调用有什么意义呢?又不是回调。
我更感觉这个Init参数是一个密码。因为传递的值不同,得到CRC校验的返回值也不同。 CRC校验算法都相同吗?对于同一个字节数组,无论什么算法一定要得到同样的CRC校验结果吗?
http://www.w3sky.com/2/2320.html函数功能:该函数CallWindowProc将消息信息传送给指定的窗口过程。
函数原型:LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);
参数:
lpPrevWndFunc:指向前一个窗口过程的指针。如果该值是通过调用GetWindowLong函数,并将该函数中的nlndex参数设为GWL_WNDPROC或DWL_DLGPROC而得到的,那么它实际上要么是窗口或者对话框的地址,要么就是代表该地址的句柄。
hWnd:指向接收消息的窗口过程的句柄。
Msg:指定消息类型。
wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
IParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。
返回值:返回值指定了消息处理结果,它与发送的消息有关
备注:使用函数CallWindowsProc可进行窗口子分类。通常来说,同一类的所有窗口共享一个窗口过程。子类是一个窗口或者相同类的一套窗口,在其消息被传送到该类的窗口过程之前,这些消息是由另一个窗口过程进行解释和处理的。
Asm(0) = &H5B5A5958
Asm(1) = &HC033505E
Asm(2) = &H3018A36
Asm(3) = &H41CED1F0
Asm(4) = &HF47ECA3B
Asm(5) = &HC3338936:00000000 58 pop eax
:00000001 59 pop ecx
:00000002 5A pop edx
:00000003 5B pop ebx
:00000004 5E pop esi
:00000005 50 push eax
:00000006 33C0 xor eax, eax
:00000008 368A01 mov al, byte ptr ss:[ecx]
:0000000B 03F0 add esi, eax
:0000000D D1CE ror esi, 1
:0000000F 41 inc ecx
:00000010 3BCA cmp ecx, edx
:00000012 7EF4 jle 00000008
:00000014 368933 mov dword ptr ss:[ebx], esi
:00000017 C3 ret