一个优化后的压缩算法(上)

算法|压缩|优化

 
这是一个在CSDN论坛中讨论过的压缩算法代码。

与WinRAR以最快方式压缩ZIP比较,
255M的文件
Level=0时 用时24.98秒 大小95.1M
Level=255时 用时30.24秒 大小91.6M

WinRAR最快压缩ZIP 用时 25.2秒 大小58.6M
标准RAR压缩,我看了一下,实在太慢,也就没试了,估计要几分钟才会有结果。

从速度看,基本持平了,这个算法虽然最大压缩能力有限,但感觉设计得很巧妙,每次都基于动态表,使软件可以做得很小巧,资源占用也很少。非常值得收藏!

'测试窗体中的代码
Option Explicit
Private WithEvents ObjZip As ClassZip
Private BgTime As Single
Private Sub Command1_Click()
    BgTime = Timer
    Command1.Enabled = False
    Command2.Enabled = False
    With ObjZip
    .InputFileName = Text1.Text
    .OutputFileName = Text2.Text
    .IsCompress = True
    .CompressLevel = Val(Text4.Text)
    .BeginProcss
    End With
    Label1.Caption = Round(Timer - BgTime, 2) & "秒"
    Command1.Enabled = True
    Command2.Enabled = True
End Sub
Private Sub Command2_Click()
    BgTime = Timer
    Command1.Enabled = False
    Command2.Enabled = False
    With ObjZip
    .InputFileName = Text2.Text
    .OutputFileName = Text3.Text
    .IsCompress = False
    .BeginProcss
    End With
    Label1 = Round(Timer - BgTime, 2) & "秒"
    Command1.Enabled = True
    Command2.Enabled = True
End Sub
Private Sub Command3_Click()
    ObjZip.CancelProcss = True
End Sub

Private Sub Form_Load()
    Set ObjZip = New ClassZip
    Command1.Caption = "压缩"
    Command2.Caption = "解压"
    Command3.Caption = "中断"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set ObjZip = Nothing
End Sub

Private Sub ObjZip_FileProgress(sngPercentage As Single)
    Label1 = Int(sngPercentage * 100) & "%"
End Sub

Private Sub ObjZip_ProcssError(ErrorDescription As String)
    MsgBox ErrorDescription
End Sub

'ClassZip类中的声明与属性、方法、事件

Option Explicit
Public Event FileProgress(sngPercentage As Single)
Public Event ProcssError(ErrorDescription As String)
Private Type FileHeader
    HeaderTag As String * 3
    HeaderSize As Integer
    Flag As Byte
    FileLength As Long
    Version As Integer
End Type
Private mintCompressLevel As Long
Private m_bEnableProcss As Boolean
Private m_bCompress As Boolean
Private m_strInputFileName As String
Private m_strOutputFileName As String
Private Const mcintWindowSize As Integer = &H1000
Private Const mcintMaxMatchLen As Integer = 18
Private Const mcintMinMatchLen As Integer = 3
Private Const mcintNull As Long = &H1000
Private Const mcstrSignature As String = "FMZ"
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Public Sub BeginProcss()
    If m_bCompress Then
        Compress
    Else
        Decompress
    End If
End Sub
Private Function LastError(ErrNo As Integer) As String
    Select Case ErrNo
        Case 1
            LastError = "待压缩文件未设置或不存在"
        Case 2
            LastError = "待压缩文件长度太小"
        Case 3
            LastError = "待压缩文件已经过压缩"
        Case 4
            LastError = "待解压文件未设置或不存在"
        Case 5
            LastError = "待解压文件格式不对或为本软件不能认别的高版本软件所压缩"
        Case 254
            LastError = "用户取消了操作"
        Case 255
            LastError = "未知错误"
    End Select
End Function
Public Property Get CompressLevel() As Integer
    CompressLevel = mintCompressLevel \ 16
End Property
Public Property Let CompressLevel(ByVal intValue As Integer)
    mintCompressLevel = intValue * 16
    If mintCompressLevel < 0 Then mintCompressLevel = 0
End Property

Public Property Get IsCompress() As Boolean
    IsCompress = m_bCompress
End Property
Public Property Let IsCompress(ByVal bValue As Boolean)
    m_bCompress = bValue
End Property

Public Property Let CancelProcss(ByVal bValue As Boolean)
    m_bEnableProcss = Not bValue
End Property

Public Property Get InputFileName() As String
    InputFileName = m_strInputFileName
End Property

Public Property Get OutputFileName() As String
    OutputFileName = m_strOutputFileName
End Property
Public Property Let OutputFileName(ByVal strValue As String)
    m_strOutputFileName = strValue
End Property
Public Property Let InputFileName(ByVal strValue As String)
    m_strInputFileName = strValue
End Property
Private Sub Class_Terminate()
    m_bEnableProcss = False
End Sub

时间: 2024-10-30 09:10:49

一个优化后的压缩算法(上)的相关文章

一个优化后的压缩算法(下)

算法|压缩|优化   '类中压缩与解压算法 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 intMatch

android开发-android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那?

问题描述 android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那? 类似支付宝的这个效果:开发-android如何实现在view上跳出一个对话框后,对话框后的界面的点击就失效了那?-html跳出对话框"> 无论如何点击弹出框后面的部分,弹出框都不会消失. 解决方案 对话框是模态的,会阻止其他操作,关掉后才行 解决方案二: dialog.setCanceledOnTouchOutside(true); 解决方案三: 现实对话框的方式有dialog,PopupWin

activex-delphi 开发了一个ACTIVEX打印控件,在VS2010 中调试正常预览,发布后到IIS上却不行了

问题描述 delphi 开发了一个ACTIVEX打印控件,在VS2010 中调试正常预览,发布后到IIS上却不行了 请各位大侠帮忙指点: delphi 开发了一个ACTIVEX打印控件直接一个OCX文件,在VS2010 中调试正常预览,发布后到IIS上却不行了,不知道什么问题.查好多网上的资料各种说法试过也不行,也制作了一个测试的数字签名,大侠们帮忙啊. 谢谢.... 解决方案 我的做法是引用命名后... ActiveFormX SS = new ActiveFormX(); 解决方案二: 碰到

突然想到一个问题,aws上创建一个密钥对后,是怎么跟你的系统用户关联的

问题描述 突然想到一个问题,aws上创建一个密钥对后,是怎么跟你的系统用户关联的 解决方案 解决方案二:指的是ssh免密码登陆?

c语言-问题:输入一个错位后的字符串,输出打字员本来想打出的句子。(将输入的字母在键盘上左移一位)

问题描述 问题:输入一个错位后的字符串,输出打字员本来想打出的句子.(将输入的字母在键盘上左移一位) #include char *s = "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./"; int main() { int i, c; while ((c = getchar()) != EOF) { for (i = 1; s[i] && s[i] != c; i++); { if (s[i]) putchar(s[i -

请高手描述下,用.NET开发好一个网站后,发布到公共网络上的具体步骤

问题描述 如题:用.NET开发好一个网站后,发布到公共网络上的具体步骤.到底要怎么做,又应该如何维护,安全性方面要怎么做,谢谢了! 解决方案 解决方案二:这问题太大了,坐等呵,顶解决方案三:都没人回答吗??

[IT]当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

原文:What really happens when you navigate to a URL 作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事. 1. 首先,你得在浏览器里输入要网址: 2. 浏览器查找域名的IP地址 导航的第一步是通过访问的域名找出其IP地址. DNS查找过程如下: 浏览器缓存 – 浏

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

这道题目没有所谓的完全的正确答案,这个题目可以让你在任意的一个点深入下去, 只要你对这个点是熟悉的.以下是一个大概流程: 浏览器向DNS服务器查找输入URL对应的IP地址. DNS服务器返回网站的IP地址. 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接 浏览器获取请求页面的html代码. 浏览器在显示窗口内渲染HTML. 窗口关闭时,浏览器终止与服务器的连接. 这其中最有趣的是第1步和第2步(域名解析).我们输入的网址(域名)是IP地址的一个别名, 在一个DNS内,一个域名对应

网络推广站上线优化后的一些反思

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 公司最近上线了一个产品站与网络推广站,因为是新公司,资金较吃紧,订单就成为解决此问题的救命稻草.笔者在优化与推广这两个站时,特别是那个长沙网络推广网站,遇到了技术上,职业道德等方面的诸多问题,一个多月过去了,虽然取得了部分成绩,但仍然不理想,现在反思如下. 一.订单不能押宝于seo 笔者公司核心业务是一款汽车产品的销售与建站推广.公司做了两个