Private Declare Sub GetMem4 Lib "msvbvm60" (Ptr As Any, RetVal As Long)
Private Function ShR1(ByVal Value As Long) As Long
ShR1 = (Value \ &H2&) And &H7FFFFFFF
End Function
Private Function ShR8(ByVal Value As Long) As Long
ShR8 = (Value \ &H100&) And &HFFFFFF
End Function
Private Function ShR16(ByVal Value As Long) As Long
ShR16 = (Value \ &H10000) And &HFFFF&
End Function
Private Function ShR24(ByVal Value As Long) As Long
ShR24 = (Value \ &H1000000) And &HFF&
End Function
Private Sub CRC32_GenTable(Table() As Long, Optional Polynomial As Long = &HEDB88320)
Dim I As Long, J As Long, C As Long, B As Long
For I = 0 To 255
C = I
For J = 0 To 7
B = (C And 1)
C = ShR1(C)
If B Then C = C Xor Polynomial
Next
Table(I) = C
Next
For I = 0 To 255
C = Table(I)
C = ShR8(C) Xor Table(C And &HFF) : Table(256 * 1 + I) = C
C = ShR8(C) Xor Table(C And &HFF) : Table(256 * 2 + I) = C
C = ShR8(C) Xor Table(C And &HFF) : Table(256 * 3 + I) = C
Next
End Sub
Function CRC32(ByVal CRC As Long, Data() As Byte) As Long
Static Table(0 To 4 * 256 - 1) As Long
Static initialized As Boolean = False
If (initialized = False) Then
CRC32_GenTable Table(), &HEDB88320
initialized = True
End If
Dim I As Long : I = LBound(Data)
Dim N As Long : N = UBound(Data) - I + 1
Dim P As Long : P = VarPtr(Data(I))
Dim t As Long
CRC = CRC Xor &HFFFFFFFF
While N > 0 And (P And &H3&) <> 0 ' 4字节对齐
CRC = Table((CRC Xor Data(I)) And &HFF&) Xor ShR8(CRC)
I = I + 1
P = P + 1
N = N - 1
Wend
While N >= 4 ' 提高带宽 每次处理4字节
GetMem4 Byval P, t
CRC = CRC Xor t
CRC = Table(768 + (CRC And &HFF&)) Xor _
Table(512 + (ShR8(CRC) And &HFF&)) Xor _
Table(256 + (ShR16(CRC) And &HFF&)) Xor _
Table(ShR24(CRC) And &HFF&)
I = I + 4
P = P + 4
N = N - 4
Wend
While N > 0 ' 剩余字节
CRC = Table((CRC Xor Data(I)) And &HFF&) Xor ShR8(CRC)
I = I + 1
N = N - 1
Wend
CRC32 = CRC Xor &HFFFFFFFF
End Function