USHORT checksum(USHORT *buffer, int size) 

unsigned long cksum=0; 
while (size > 1) 

cksum += *buffer++; 
size -= sizeof(USHORT); 

if (size) 

cksum += *(UCHAR*)buffer; 

cksum = (cksum >> 16) + (cksum & 0xffff); 
cksum += (cksum >>16); 
return (USHORT)(~cksum); 

解决方案 »

  1.   

    '由于不知道USHORT是什么类型,故推断假设它为:
    'typedef unsigned short int USHORT
    private function checksum(buffer as any, size as long) as long
    dim cksum as long
    dim df as integer
    cksum=0
    df = size mod 2
    do while (size > 1)
     cksum = cksum + buffer(size \ 2 + df)
     size = size - 2; ' sizeof(short int) = 2
    loop 
    if (df = 1) then cksum = cksum + buffer(0)
    cksum = (cksum \ (2^16)) + (cksum and &Hffff)
    cksum = cksum + (cksum \ (2^16) )
    checksum = (cksum and &Hffff)
    end if
    '这个函数在size为奇数时不一定能成功,想成功的话用读写内存的API吧,VB里可没有指针……
      

  2.   

    按照 mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\vclang.chm::/html/_pluslang_fundamental_types.htmOption ExplicitPrivate Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
         ByRef Destination As Any, _
         ByRef Source As Any, _
         ByVal Length As Long)Function UnsignedAdd(ByVal v1 As Long, ByVal v2 As Long) As Long
        UnsignedAdd = (v1 Xor &H80000000) + v2 Xor &H80000000
    End FunctionFunction Checksum(ByVal pBuffer As Long, ByVal size As Long) As Integer
        Dim chsum As Long, a() As Integer, i As Long
        
        If size = 0 Then Exit Function
        
        ReDim a(((size + 1) \ 2) - 1)
        CopyMemory a(0), ByVal pBuffer, size
        
        For i = 0 To UBound(a)
            chsum = UnsignedAdd(chsum, CLng(a(i)) And &HFFFF&)
        Next
        
        chsum = ((chsum \ &H10000) And &HFFFF&) + (chsum And &HFFFF&)
        chsum = ((chsum \ &H10000) And &HFFFF&) + chsum
        Checksum = chsum And &HFFFF
    End Function