CRC32
Posted: Mon Dec 19, 2005 1:52 am
Code updated For 5.20+
no CRC32FileFingerprint in PB so i made one
Dri 
no CRC32FileFingerprint in PB so i made one
Code: Select all
Structure Bytes
b.b[0]
EndStructure
#CRC32_BufferLength = 2048
Global Dim CRC32_Table($FF)
Global CRC32_TableComputed
Procedure CRC32_MakeTable()
Protected i, j, crc
For i = 0 To $FF
crc = i
For j = 1 To 8
If crc & 1
crc = $EDB88320 ! ((crc >> 1) & $7FFFFFFF)
Else
crc = (crc >> 1) & $7FFFFFFF
EndIf
Next j
CRC32_Table(i) = crc
Next i
CRC_TableComputed = #True
EndProcedure
Procedure CRC32_Update(crc, *buffer.Bytes, Length)
Protected i
If CRC32_TableComputed = #False
CRC32_MakeTable()
EndIf
While i < Length
crc = CRC32_Table((crc ! *buffer\b[i]) & $FF) ! ((crc >> 8) & $00FFFFFF)
i + 1
Wend
ProcedureReturn crc
EndProcedure
Procedure CRC32_Fingerprint(*buffer, Length)
ProcedureReturn ~CRC32_Update($FFFFFFFF, *buffer, Length)
EndProcedure
Procedure CRC32_FileFingerprint(Filename.s)
Protected crc, File, Buffer, Offset, Length
File = ReadFile(#PB_Any, Filename)
If File
Buffer = AllocateMemory(#CRC32_BufferLength)
If Buffer
Length = Lof(File)
crc = $FFFFFFFF
While (Length - Offset) > #CRC32_BufferLength
ReadData(File,Buffer, #CRC32_BufferLength)
crc = CRC32_Update(crc, Buffer, #CRC32_BufferLength)
Offset + #CRC32_BufferLength
Wend
If Length > Offset
Length - Offset
ReadData(File,Buffer, Length)
crc = CRC32_Update(crc, Buffer, Length)
EndIf
FreeMemory(Buffer)
EndIf
CloseFile(File)
EndIf
ProcedureReturn ~crc
EndProcedure
