注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

7-Zip 压缩与解压库-调用范例(转)  

2011-04-12 11:11:54|  分类: Win32汇编学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Welcome to the 7-Zip Home!开源站:http://www.7-zip.org/ 感谢Igor Pavlov的开源精神......
LZMA,(Lempel-Ziv-Markov chain-Algorithm的缩写),是一个Deflate和LZ77算法改良和优化后的压缩算法,开发者是Igor Pavlov,2001年被首次应用于7-Zip压缩工具中,是 2001年以来得到发展的一个数据压缩算法。它使用类似于 LZ77 的字典编码机制,在一般的情况下压缩率比 bzip2 为高,用于压缩的可变字典最大小可达4GB。
LZMA 是 7-Zip 程序中7z 格式的默认压缩算法。LZMA 能提供给用户极高的压缩比及较快的压缩速度,它非常适合与应用程序集成。
正是出于这点,今天才研究了一下,我想,对我现在的情形,重构它可能性几乎为0。主要是没有这个时间和精力,不过生成目标文件与自己的程序集成是可行的(刚才经过优化生成了个10KB的obj文件),对我们而言,解压这种格式是最必要的,首先我们压缩之后,在我们的程序中只要集成解压程序是不错的,像千千静听的皮肤资源就是以这种方式,当然它用的是zip格式,考虑到7z的优越性能,所以对其如何调用,有必要研究一下。
不说废话了...............对了,还提醒一下,要下载LZMA SDK的同样在上面的网站上找,只是目前对其公开的内嵌式应用很少获得技术细节,所以...................
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;*--==--* Call LZMA.Dll  example  (Lempel-Ziv-Markov chain-Algorithm)
;*--==--* By G-Spider 2010.10.18
;*--==--* Web:http://blog.csdn.net/G_Spider
;*--==--* -------------------------------------------------------------------
;*--==--* ml  /c /coff TestLzmaDll.asm  
;*--==--* link /subsystem:console TestLzmaDll.obj
;*--==--* 请保持以上完整性!!
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
.586
.model flat,stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include msvcrt.inc
includelib kernel32.lib
includelib user32.lib
includelib msvcrt.lib
pcomethod6        TYPEDEF PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
comethod6        TYPEDEF PTR pcomethod6
pcomethod13        TYPEDEF PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,\
                :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
comethod13        TYPEDEF PTR pcomethod13
  
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        .data
szLzmaDLL                db      'Lzma.dll',0
szLzmaCompress           db      'LzmaCompress',0
szLzmaUncompress         db        'LzmaUncompress',0
szFileName               db      'Test.bmp',0   ;待压缩文件,可为全路径等,下同
szCompressName            db      'tst.lzma',0    ;压缩后的文件名
szUncompressName           db      'mytst.bmp',0   ;解压后的文件名
szInform1               db      'LzmaCompressing ....',0dh,0ah,0
szInform2               db      'LzmaUnCompressing ....',0dh,0ah,0
szInform3               db      'All Success ....',0dh,0ah,0
OutProps                 db      0,0,0,0,0
OutPropsSize             dd      5   
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
        .data?
LzmaCompress                  comethod13      ?  
LzmaUncompress                comethod6        ?
hLzmaDLL                dd              ?
hHandle                 dd              ?
hHandle1                dd              ?
hHandle2                dd              ?
lpInputBuf              dd              ?
lpOutputBuf             dd              ?
dwInputSize             dd              ?
dwOutputLen             dd              ?
lpNumberOfBytes             dd                ?
lpNumberOfBytes1             dd                ?
        .code
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
start:
    ;------------------------------------------------------------------------
    invoke  LoadLibrary,offset  szLzmaDLL
    mov     hLzmaDLL,eax
    push    eax
    invoke  GetProcAddress,eax,offset  szLzmaCompress
    mov     LzmaCompress,eax
    pop     eax
    invoke  GetProcAddress,eax,offset  szLzmaUncompress
    mov     LzmaUncompress,eax
    ;------------------------------------------------------------------------
    ;预处理
    invoke CreateFile,offset szFileName,GENERIC_READ,FILE_SHARE_READ,\
           NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    MOV    hHandle,eax
            
    invoke  GetFileSize,eax,NULL
    mov     dwInputSize,eax
    mov     dwOutputLen,eax
            
    invoke  crt_malloc,dwInputSize
    mov     lpInputBuf,eax
            
    invoke  RtlZeroMemory,lpInputBuf,dwInputSize
    invoke  ReadFile,hHandle,lpInputBuf,dwInputSize,offset lpNumberOfBytes1,NULL
            
    invoke  crt_malloc,dwOutputLen
    mov     lpOutputBuf,eax
    invoke  RtlZeroMemory,lpOutputBuf,dwOutputLen
    invoke  crt_printf,offset  szInform1
    ;------------------------------------------------------------------------   
    ;文件压缩,成功则返回0
    invoke  LzmaCompress,lpOutputBuf,offset dwOutputLen,lpInputBuf, dwInputSize,\
            offset OutProps,offset OutPropsSize,5, 10000h, 3, 0, 2, 32,2
    .if            eax==0
            invoke  crt_printf,offset  szInform2
    .endif
    invoke  RtlZeroMemory,lpInputBuf,dwInputSize
    ;------------------------------------------------------------------------
    ;文件解压,成功则返回0
    invoke  LzmaUncompress,lpInputBuf,offset dwInputSize,lpOutputBuf,\
            offset dwOutputLen,offset OutProps,OutPropsSize
    .if     eax == 0
            invoke  crt_printf,offset  szInform3
    .endif
    ;------------------------------------------------------------------------
    ;输出压缩文件        
    invoke CreateFile,offset szCompressName,GENERIC_WRITE,FILE_SHARE_READ,\
           NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    .if    eax == INVALID_HANDLE_VALUE
           invoke MessageBox,NULL,0,0,0
    .endif
    mov     hHandle1,eax
    invoke  WriteFile,eax,lpOutputBuf,dwOutputLen,offset lpNumberOfBytes,NULL
    ;输出解压文件
    invoke  CreateFile,offset szUncompressName,GENERIC_WRITE,FILE_SHARE_READ,\
            NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    mov     hHandle2,eax
    invoke  WriteFile,eax,lpInputBuf,dwInputSize,offset lpNumberOfBytes,NULL
            
    invoke  CloseHandle,hHandle
    invoke  CloseHandle,hHandle1
    invoke  CloseHandle,hHandle2
    invoke  FreeLibrary,hLzmaDLL
     
    invoke ExitProcess,0
end start
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
复制代码
  评论这张
 
阅读(177)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017