' Copyright (c) Wrox Press Ltd 2002. All rights reserved.
' Buyers of the Visual Basic .NET Solutions Toolkit book (ISBN 1861007396) can use this code without restriction.
' This code cannot be copied, compiled, or altered except by buyers of the aforementioned book.
' Wrox Press Ltd retains copyright of this code in all cases and unauthorized transmission, duplication, and
' publishing is forbidden.
Imports System
Imports System.IO
Namespace Wrox.Toolkit.Util
Public Class Crc32
Private Const TABLESIZE As Integer = 256
Private Const DEFAULTPOLYNOMIAL As Integer = &HEDB88320
Private Const DEFAULTINITIALVALUE As Integer = &HFFFFFFFF
Private lookup(TABLESIZE - 1) As Integer
Private crcPolynomial As Integer = 0
Public Sub New()
Me.New(DEFAULTPOLYNOMIAL)
End Sub
Public Sub New(ByVal crcPolynomial As Integer)
Me.crcPolynomial = crcPolynomial
InitLookupTable()
End Sub
Public Property Polynomial() As Integer
Get
Return crcPolynomial
End Get
Set(ByVal Value As Integer)
Me.crcPolynomial = value
InitLookupTable()
End Set
End Property
Public Overloads Function CalculateBlock(ByVal bytes() As Byte) _
As Integer
Return CalculateBlock(bytes, 0, bytes.Length)
End Function
Public Overloads Function CalculateBlock(ByVal bytes() As Byte, _
ByVal index As Integer, _
ByVal length As Integer _
) As Integer
Return CalculateBlock(bytes, index, length, DEFAULTINITIALVALUE)
End Function
Public Overloads Function CalculateBlock( _
ByVal bytes() As Byte, _
ByVal index As Integer, _
ByVal length As Integer, _
ByVal initialValue As Integer) _
As Integer
If bytes Is Nothing Then
Throw New ArgumentNullException("CalculateBlock(): bytes")
ElseIf index < 0 Or length <= 0 _
Or index + length > bytes.Length Then
Throw New ArgumentOutOfRangeException()
End If
Return Not InternalCalculateBlock(bytes, index, _
length, initialValue)
End Function
Private Function InternalCalculateBlock( _
ByVal bytes() As Byte, _
ByVal index As Integer, _
ByVal length As Integer, _
ByVal initialValue As Integer) _
As Integer
Dim crc As Integer = initialValue
Dim shiftedCrc As Integer
Dim position As Integer
For position = index To length - 1
shiftedCrc = crc And &HFFFFFF00
shiftedCrc = shiftedCrc / &H100
shiftedCrc = shiftedCrc And &HFFFFFF
crc = shiftedCrc Xor lookup(bytes(position) Xor _
(crc And &HFF))
Next
Return crc
End Function
Public Overloads Function CalculateFile(ByVal path As String) _
As Integer
Return CalculateFile(path, DEFAULTINITIALVALUE)
End Function
Public Overloads Function CalculateFile( _
ByVal path As String, _
ByVal initialValue As Integer) _
As Integer
If path Is Nothing Then
Throw New ArgumentNullException("path")
ElseIf path.Length = 0 Then
Throw New ArgumentException("Invalid path")
End If
Return Not InternalCalculateFile(path, initialValue)
End Function
Private Function InternalCalculateFile( _
ByVal path As String, _
ByVal initialValue As Integer) _
As Integer
Const blockSize As Integer = 4096
Dim count As Integer
Dim inStream As FileStream
Dim bytes(blockSize - 1) As Byte
Dim crc As Integer = initialValue
Try
inStream = File.Open(path, FileMode.Open, FileAccess.Read)
While inStream.Position < inStream.Length
count = inStream.Read(bytes, 0, blockSize)
crc = InternalCalculateBlock(bytes, 0, count, crc)
End While
Finally
If Not inStream Is Nothing Then
inStream.Close()
End If
End Try
Return crc
End Function
Private Sub InitLookupTable()
Dim byteCount, bitCount As Integer
Dim crc, shiftedCrc As Integer
For byteCount = 0 To TABLESIZE - 1
crc = byteCount
For bitCount = 0 To 7
shiftedCrc = crc And &HFFFFFFFE
shiftedCrc = shiftedCrc / &H2
shiftedCrc = shiftedCrc And &H7FFFFFFF
If (crc And &H1) Then
crc = shiftedCrc Xor crcPolynomial
Else
crc = shiftedCrc
End If
Next
lookup(byteCount) = crc
Next
End Sub
End Class
End Namespace
' Copyright (c) Wrox Press Ltd 2002. All rights reserved.
' Buyers of the Visual Basic .NET Solutions Toolkit book (ISBN 1861007396) can use this code without restriction.
' This code cannot be copied, compiled, or altered except by buyers of the aforementioned book.
' Wrox Press Ltd retains copyright of this code in all cases and unauthorized transmission, duplication, and
' publishing is forbidden.
Imports System
Imports Wrox.Toolkit.Util
Module CRC32Test
Sub Main(ByVal cmdArgs() As String)
If cmdArgs.Length <> 1 Then
Console.WriteLine("Usage: CRC32Test <path>")
Exit Sub
End If
Try
Dim crc32Val As Integer
Dim crc As New Crc32()
crc32Val = crc.CalculateFile(cmdArgs(0))
Console.WriteLine("CRC32 is {0:x}", crc32Val)
Catch e As Exception
Console.WriteLine("An exception occurred: {0}", e.Message)
End Try
End Sub
End Module