日期:2012-01-11 浏览次数:20495 次
'类中压缩与解压算法
Private Sub Compress()
Dim lngTemp As Long, intCount As Integer
Dim intBufferLocation As Integer
Dim intMaxLen As Integer
Dim intNext As Integer
Dim intPrev As Integer
Dim intMatchPos As Integer
Dim intMatchLen As Integer
Dim intInputFile As Integer
Dim intOutputFile As Integer
Dim aintWindowNext(mcintWindowSize + 1 + mcintWindowSize) As Integer
Dim aintWindowPrev(mcintWindowSize + 1) As Integer
Dim intByteCodeWritten As Long
Dim intBitCount As Integer
Dim abytWindow(mcintWindowSize + mcintMaxMatchLen) As Byte
Dim udtFileH As FileHeader
Dim strOutTmpFile As String
Dim lngBytesRead As Long
Dim lngFileLength As Long
Dim lngCurWritten As Long
Dim lngInBufLen As Long, abytInputBuffer() As Byte, abytOutputBuffer() As Byte
Dim lngOutBufLen As Long, lngInPos As Long, lngOutPos As Long
Dim intErrNo As Integer
On Error GoTo PROC_ERR
m_bEnableProcss = True
If Len(Dir(m_strInputFileName)) = 0 Or Len(m_strInputFileName) = 0 Then intErrNo = 1: GoTo PROC_ERR
If Len(m_strOutputFileName) = 0 Then m_strOutputFileName = m_strInputFileName
strOutTmpFile = m_strOutputFileName & ".tmp"
If Len(Dir(strOutTmpFile)) > 0 Then Kill strOutTmpFile
If FileLen(m_strInputFileName) < 100 Then intErrNo = 2: GoTo PROC_ERR
intInputFile = FreeFile
Open m_strInputFileName For Binary Access Read As intInputFile
Get intInputFile, , udtFileH
Seek #intInputFile, 1
If udtFileH.HeaderTag = mcstrSignature Then intErrNo = 3: GoTo PROC_ERR
intOutputFile = FreeFile
Open strOutTmpFile For Binary As intOutputFile
For intCount = 0 To mcintWindowSize
aintWindowPrev(intCount) = mcintNull
abytWindow(intCount) = &H20
Next
CopyMemory aintWindowNext(0), aintWindowPrev(0), (mcintWindowSize + 1) * 2
CopyMemory aintWindowNext(mcintWindowSize + 1), aintWindowPrev(0), mcintWindowSize * 2
CopyMemory abytWindow(mcintWindowSize + 1), abytWindow(0), mcintMaxMatchLen - 1
intByteCodeWritten = 1
lngFileLength = LOF(intInputFile)
lngInBufLen = &HA000&
lngOutBufLen = &HA000&
If lngInBufLen > lngFileLength Then lngInBufLen = lngFileLength
ReDim abytInpu