home *** CD-ROM | disk | FTP | other *** search
- Attribute VB_Name = "Module1"
- Option Explicit
-
- Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
-
- Private crc32table(255) As Long
- Private Crc32TableSet As Boolean
-
- Public Sub CreateTable(Optional lPolinomio As Long = &HEDB88320)
- Dim I As Long
- Dim j As Long
- Dim lCrc As Long
-
- For I = 1 To 255 Step 1
- lCrc = I
- j = 8
-
- For j = 1 To 8 Step 1
- If (lCrc And 1) Then
- lCrc = ((lCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
- lCrc = lCrc Xor lPolinomio
- Else
- lCrc = ((lCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
- End If
- Next
-
- crc32table(I) = lCrc
- Next I
-
- Crc32TableSet = True
-
- End Sub
-
- Public Function CalcCRC32(ByteArr() As Byte) As Long
- Dim I As Long
- Dim CRC32Val As Long
- Dim ArrLen As Long
- Dim LongBytes(3) As Byte
-
- If (Not Crc32TableSet) Then CreateTable
-
- CRC32Val = -1
- ArrLen = UBound(ByteArr())
-
- For I = 0 To ArrLen Step 1
- SplitLongValues CRC32Val, LongBytes(): LongBytes(3) = 0
- CRC32Val = crc32table((CRC32Val Xor ByteArr(I)) And &HFF)
- CRC32Val = CRC32Val Xor MergeLongValues(LongBytes())
- Next
-
- CalcCRC32 = CRC32Val
- End Function
-
- Public Function CalcCRC32FromString(sStr As String) As Long
- Dim bArr() As Byte, I As Long
-
- If Len(sStr) > 0 Then
-
- ReDim bArr(0 To (Len(sStr) - 1)) As Byte
-
- For I = 1 To Len(sStr) Step 1
- bArr(I - 1) = Asc(Mid(sStr, I, 1))
- Next
-
- CalcCRC32FromString = CalcCRC32(bArr())
-
- End If
-
- End Function
-
- Public Function CalcCRC32FromFile(sFile As String) As Long
- On Local Error Resume Next
-
- Dim bArr() As Byte, I As Long, L As Long
-
- If FileLen(sFile) > 0 Then
- If Err <> 0 Then Err = 0: Exit Function
-
- ReDim bArr(0 To (FileLen(sFile) - 1)) As Byte
-
- L = FreeFile()
- Open sFile For Binary As L
- Get L, , bArr()
- Close L
-
- CalcCRC32FromFile = CalcCRC32(bArr())
-
- End If
-
- End Function
-
- Public Sub SplitLongValues(lValue As Long, ByteArr() As Byte)
-
- CopyMemory ByteArr(0), lValue, 4
-
- End Sub
-
- Public Sub SplitIntegerValues(iValue As Integer, ByteArr() As Byte)
-
- CopyMemory ByteArr(0), lValue, 2
-
- End Sub
-
- Public Function MergeLongValues(ByteArr() As Byte) As Long
-
- CopyMemory MergeLongValues, ByteArr(0), 4
-
- End Function
-
- Public Function MergeIntegerValues(ByteArr() As Byte) As Integer
-
- CopyMemory MergeIntegerValues, ByteArr(0), 2
-
- End Function
-