zoukankan      html  css  js  c++  java
  • 7z文件格式及其源码linux/windows编译

    7z文件格式及其源码的分析(二)

    一. 准备工作:

    1. 源码下载:

    可以从官方中文主页下载:http://sparanoid.com/lab/7z/.  为了方便, 这里直接给出下载链接: http://downloads.sourceforge.net/sevenzip/7z920.tar.bz2 . 

    2. 工具准备:

    源码中给的工程文件都是vc6.0的工程.  作者说他不喜欢新vs的界面. 哎.  不过没关系, 我们使用VS2008也一样可以. 有极少地方需要修改一下.  我们使用VS2008 sp1 作为开发环境. 

    二. HelloWorld:

    我们在根目录下新建一个目录"7z", 把源码都解压到这个位置.

    我们稍后再详细解释这些目录的意思.   先来一个helloworld, 程序员的最爱.

    请直接打开这个路径: 7zCPP7zipBundlesAlone

    用vs打开其中的 Alone.dsw 文件.   提示要转换工程文件. 点击同意.   然后编译这个工程. 如果不出意外的话, 应该提示你编译成功了.

    这个时候, 打开 c:util  目录.  里面已经生成7za.exe.    注意, 这里是C盘的绝对路径 :  c:UTIL7za.exe

    好了, 这个7za.exe  就是一个包含全部7z功能的压缩,解压命令行工具了.

    我们可以从命令行进入该目录. 输入 7za.exe 回车. 就能看到它的帮助信息啦.

    我们先拷贝一个文件到这个目录, 比如拷贝一个test.txt 到c:util 里面去.  我们用命令行来压缩它.

    ==============

    c:util>7za.exe  a  test.7z  test.txt

    ==============

    这个命令把test.txt  压缩成test.7z.   这两个文件名都是可以带路径的,  为了方便, 我们都拷贝到当前目录了.

    恩, 我们再来试试解压.

    ==============

    c:util>7za.exe x  test.7z  -oout

    ==============

    这个命令可以吧test.7z 解压到当前的out目录下.

    试试这两个命令吧, 是不是还不错.

    三, 目录结构详解:

    我们先回到最外层目录:

    7z源码基本上是按文件类型分类的.   

    1.  上面的ASM目录, 其中保存汇编代码.  为了极限的性能, 7z使用了部分汇编代码, crc计算, 和aes加密.  这两点都不是必须的, 实际上, 它们都有c语言的实现. 7z会检测, 如果cpu提供了硬件的aes指令, 就会使用硬件aes汇编指令, 而不会使用自己的aes函数.

    2. "C" 目录是7z的核心.   实际上, 7z所有的核心算法都是用c语言实现的. 包括所有的压缩算法, 以及我们的主角7z打包算法.   这些c代码非常强悍, 部分代码可以跨平台编译, 甚至能在嵌入式平台上编译.

     (a)  这里面有几个工程文件值得我们注意, 找到这个位置: 7zCUtil7z

    我们来编译它. 它会在debug目录下生成  7zdec.exe

    这是一个最小化的指包含7z解压器的独立exe程序.  有了它就可以解压文件了.

    (b) 找到这个目录,  7zCUtilLzma

    编译之后也会在绝对目录生成.   c:util7lzma.exe.  这是一个lzma压缩算法的工具.  只能压缩或解压单个文件. 只包含lzma算法.

    这可以用来测试lzma算法.

    (c) 打开这个目录 7zCUtilLzmaLib. 

    这个工程用来生成 只包含lzma算法的 dll.  以便你的程序调用lzma算法.

    3. "CPP" 目录是也是7z的重点.  

    前面说了核心的算法都在C目录下面.  那么CPP目录是做什么的呢.   除了核心的算法之外, 7z还有非常丰富的外围功能.  就是他的文件管理器, 以及右键菜单支持等等. 这些与UI和系统相关的功能都是用c++实现的.     此外, C中的核心算法在cpp目录中都有c++的面向对象的封装.  我们来逐一介绍它的子目录:

    a ) "Windows" 目录.  

    其中包含了与windows集成的功能. 包括菜单集成, 剪贴板支持, 文件io,等等.

    b) "Common" 目录.

    通用的工具类.

    c ) 我们重点介绍 7zip 目录:

            (1) "Archive" 目录. 包含各种 archive ("打包") 算法的代码.   因为7z不光支持7z文件,  还支持zip, rar, chm等等其他的打包文件格式.   

    这里面每个目录就是一种格式.   7z目录当然就是我们的主角7z格式了. ( 这里面的代码是对C文件夹里面的代码的c++封装. )  这里面有一个工程文件.

    打开这个工程文件, 然后在工程上面点右键,查看属性:

    可以看到, 它的输出路径是: C:Program Files7-zipFormats7z.dll

    这是什么意思呢?   对,  这个工程就是封装7z格式的dll.  这个工程的目的就是给我们演示如何让7z支持我们的自定义格式.   具体怎么实现自定义格式, 可以参考这个工程以及 它周围的其他文件夹格式, 比如:Cab, Chm, 等等. 实现相应的com接口, 然后编译到这个目录下, 7z就能自动调用了.  以后有时间我们再详细介绍这个.

      (2) 再来看 "Bundles" 目录.

    这里面的Alone目录, 我们在前面 写 helloworld 的时候已经见识过了. 它是一个包含全部7z功能的console 的exe.  

    其中我们再介绍另一个重要的目录,  就是Format7zF.

    打开它, 编译,  会提示几个链接错误.  原因是因为作者使用的是vc6. 和我们使用的vs2008一些编译选项不支持了.

    分别在这几个汇编文件上点击右键:

    找到"CommandLine" 参数, 把其中的参数删除:  -omf -WX -W3,  只保留 -c 

    然后再编译就会成功了.

    编译完成之后, 它会在绝对目录下生成一个dll.  C:Program Files7-Zip7z.dll

    这个dll是做什么的呢? 

    它是包含7z全部功能的dll.   第三方的程序可以调用这个dll实现7z的所有功能.   包括7z自己本身的文件管理器 都是通过这种方式调用的.

    好了, 基本上 7z源码的主要目录都介绍完了.  大家有什么疑问可以留言交流.

    我们之后的讲解都将使用: 7zCPP7zipBundlesAlone 这个目录下的工程配合命令行参数来调试讲解. 因为这是一个包含7z全部功能的console程序, 简单好调试.

    如果你不想了解7z的文件结构,  只是想在你的程序中集成进处理7z文件的功能. 那么已经足够了.  可以打开上面介绍的相应工程,  把源码集成到你的工程中, 或者直接调用: 7zCPP7zipBundlesFormat7zF 生成的dll. 都是不错的选择.

    使用Visual Studio编译7z源码

    两种方式,一种命令行使用nmake,一种通过visual studio。

    0x01 源码下载

    http://www.7-zip.org/download.html


    0x02 makefile修改

    %7z_source%CPPBuild.mak文件第34行附近,找到LFLAGS = $(LFLAGS) -OPT:NOWIN98,删除-OPT:NOWIN98选项

    此处不修改,后面nmake会报错,根据提示信息找到对应文件删除该选项也可以。

    参考页面:http://www.ski-epic.com/2012_compiling_7zip_on_windows_with_visual_studio_10/index.html


    0x03 编译

    vs命令提示符工具,cd到%7z_source%CPP7zip目录,执行

    nmake NEW_COMPILER=1 MY_STATIC_LINK=1

    等待编译结束即可。


    0x04 Visual Studio编译

    使用VS打开%7z_source%CPP7zipBundlesFormat7zFFormat7z.dsw

    在7zCrcOpt.asm和AesOpt.asm两个文件上右键属性,修改其配置信息,如图

    参考页面:

    http://stackoverflow.com/questions/12387701/error-lnk1104-obj-file-without-any-file-name

    http://blog.csdn.net/butwang/article/details/6164933


    0x05 Build

    0x06 Help

    关于7z源代码文件结构说明

    [Bundle]
    Alone         7za.exe: Standalone version of 7z
    Alone7z       7zr.exe: Standalone version of 7z that supports only 7z/LZMA/BCJ/BCJ2
    SFXCon        7zCon.sfx: Console 7z SFX module
    SFXWin        7z.sfx: Windows 7z SFX module
    SFXSetup      7zS.sfx: Windows 7z SFX module for Installers
    Format7z            7za.dll:  .7z support
    Format7zExtract     7zxa.dll: .7z support, extracting only
    Format7zR           7zr.dll:  .7z support, LZMA/BCJ* only
    Format7zExtractR    7zxr.dll: .7z support, LZMA/BCJ* only, extracting only
    Format7zF           7z.dll:   all formats
    
    [UI]
    Agent         Intermediary modules for FAR plugin and Explorer plugin
    Console       7z.exe Console version
    Explorer      Explorer plugin
    Resource      Resources
    Far           FAR plugin
    Client7z      Test application for 7za.dll
    
    [Compress]
    BZip2        BZip2 compressor
    Branch       Branch converter
    ByteSwap     Byte Swap converter
    Copy         Copy coder
    Deflate
    Implode
    Arj
    LZMA
    PPMd          Dmitry Shkarin's PPMdH with small changes.
    LZ            Lempel - Ziv
    
    [Crypto]
    7zAES         Cipher for 7z
    AES           AES Cipher
    Rar20         Cipher for Rar 2.0
    RarAES        Cipher for Rar 3.0
    Zip           Cipher for Zip
  • 相关阅读:
    Mayan游戏 (codevs 1136)题解
    虫食算 (codevs 1064)题解
    靶形数独 (codevs 1174)题解
    黑白棋游戏 (codevs 2743)题解
    神经网络 (codevs 1088) 题解
    The Rotation Game (POJ 2286) 题解
    倒水问题 (codevs 1226) 题解
    银河英雄传说 (codevs 1540) 题解
    生日蛋糕 (codevs 1710) 题解
    第一章 1.11 高阶函数
  • 原文地址:https://www.cnblogs.com/timssd/p/10199732.html
Copyright © 2011-2022 走看看