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
  • 相关阅读:
    自定义 spark transformer 和 estimator 的范例
    spark 与 scikit-learn 机器学习流程组件设计哲学比较
    命名空间和作用域
    FeatureUnion 与 ColumnTransformer 关系
    注解与装饰器
    装饰器编写--要点
    闭包结构的本质
    SQL 自动增长 identity
    SQL 基本的函数
    int和long long有符号整形 负数比正数多一个
  • 原文地址:https://www.cnblogs.com/timssd/p/10199732.html
Copyright © 2011-2022 走看看