'**** 代码开始 ****
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 的返回值也发生变化。哪位知道用法?

解决方案 »

  1.   

    不用解答了,又找到一个更好的,说是vb.net改写的,还是CRC32呢!
    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
      

  2.   

    那么,这个VB+汇编的代码应该怎么使用呢?ByVal Init As Long的参数是什么意思?
      

  3.   

    To chenhui530(陈辉) :
      能请教VB+汇编的代码应该怎么使用?ByVal Init As Long的参数是什么意思?
      

  4.   

    init在这里按值传递给AsmCrc调用
    另外
    CallWindowProc函数 
    参数: 意义 
    lpPrevWndFunc Long,原来的窗口过程地址 HWnd Long,窗口句柄 Msg Long,发送的消息 
    wParam Long,消息类型,参考wParam参数表 
    lParam Long,依据wParam参数的不同而不同 
    返回值 Long,依据发送的消息不同而变化 
      

  5.   

    ByVal Init As 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猜的,呵呵
      

  6.   

    To ayalicer(小刀惋心):
    >init在这里按值传递给AsmCrc调用  参数声明是:ByVal Init As Long,当然是“按值”传递啦!这连菜鸟都知道。
      我的问题是应该传递什么值。To yachong(蚜虫) :
      这样循环调用有什么意义呢?又不是回调。
      我更感觉这个Init参数是一个密码。因为传递的值不同,得到CRC校验的返回值也不同。  CRC校验算法都相同吗?对于同一个字节数组,无论什么算法一定要得到同样的CRC校验结果吗?
      

  7.   

    我怎么看了半天觉得这不是个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可进行窗口子分类。通常来说,同一类的所有窗口共享一个窗口过程。子类是一个窗口或者相同类的一套窗口,在其消息被传送到该类的窗口过程之前,这些消息是由另一个窗口过程进行解释和处理的。
      

  8.   

    贴出这些数代表的意思(反汇编),供参考
        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