RAR 2.02版本 - 技术信息

来源:互联网 发布:unity3d开发的游戏 编辑:程序博客网 时间:2024/05/21 09:42

/*================================================================
该文档由lxleaves翻译,由于本人能力有限,或多或少会有不足之处,希望海涵;
请尊重翻译者的劳动,不要任意修改翻译者的原意;
本翻译在组织上遵循原版格式,如果你在某些地方理解出现问题,请通读全文,
便会得到满意结果;
另外,如果你想为该说明文件添加注释,或用于出版物,请保留此处申明,谢谢;
如果你对C语言有基本的理解,你会更容易接受本文的逻辑,
如少数地方’&’和’==’表示的意义。
=================================================================*/
                    RAR 2.02版本 - 技术信息
                   ~~~~~~~~~~~~~~~~~~~~~~~~~
=====================================
=======以下描述仅适用于1.50版本以后的档案文件===========
=====================================
============= RAR 档案文件格式===============
=====================================
    档案文件由许多不定长度的区块组成。这些区块的次序可能是多样的,但是
第一个区块必须符合档案文件特定的格式。
    每个区块由以下几个部分组成:
 HEAD_CRC  2 bytes  区块CRC验证
 HEAD_TYPE  1 bytes  区块属性
 HEAD_FLAGS  2 bytes  区块标记
 HEAD_SIZE  2 bytes  区块大小
 ADD_SIZE  4 bytes  任意区域-区块添加的大小

 ADD_SIZE 只有在 (HEAD_FLAGS & 0x8000) != 0 时才有实际意义
 当 (HEAD_FLAGS & 0x8000) == 0 时区块总大小等于 HEAD_SIZE,如果
 ADD_SIZE有意义(即当 (HEAD_FLAGS & 0x8000) != 0 时),区块总大小
 等于 HEAD_SIZE 与 ADD_SIZE 之和。
    在每个区块中,HEAD_FLAGS中包含的以下标记具有相同意义:
 0x4000 --- 如果被设定,低版本的RAR将跳过,并且当档案文件被更新时,
   这个区块将被移除;
   如果被设定,那么当档案文件被更新时,该区块被复制到
   新的档案文件。
 0x8000 --- 如果被设定,ADD_SIZE 将是有效的,并且全区块的大小是
   HEAD_SIZE 与 ADD_SIZE 之和。
 已公布的区块类型:
 HEAD_TYPE=0x72 作标记的区块(marker block)
 HEAD_TYPE=0x73 RAR档案头(archive header)
 HEAD_TYPE=0x74 文件头(file header)
 HEAD_TYPE=0x75 注释头(comment header)
 HEAD_TYPE=0x76 额外信息(extra information)
 HEAD_TYPE=0x77 补充区块(subblock)
 HEAD_TYPE=0x78 恢复记录(recovery record)
 注释区块实际上仅仅与其它区块同时使用,并且不会单独存在。

    档案文件处理由以下环节组成;
 1,读取并且检查区块标记
 2,读档案头
 3,读取或跳过HEAD_SIZE-sizeof(MAIN_HEAD)字节的内容
 4,检查HEAD_TYPE
  需要读取区块的情况:
  如果 HEAD_TYPE==0x74
   读取文件头(前7字节已经读取)
   读取或跳过 HEAD_SIZE-sizeof(FILE_HEAD) 字节
   读取或跳过 FILE_SIZE 字节
  否则
   读取相应的 HEAD_TYPE 区块:
   读取 HEAD_SIZE-7 字节
   如果 (HEAD_FLAGS & 0x8000)
    读取 ADD_SIZE 字节
  需要跳过区块的情况:
   跳过 HEAD_SIZE-7 字节
   如果 (HEAD_FLAGS & 0x8000)
   跳过 ADD_SIZE 字节
 6,转到 4.

 


======================================
=============        区块格式        =============
======================================

作标记的区块(Marker block ( MARK_HEAD ))

HEAD_CRC 总是为 0x6152
2 字节

HEAD_TYPE 区块属性:0x72
1 字节

HEAD_FLAGS 总是为 0x1a21
2 字节

HEAD_SIZE 区块大小 = 0x0007
2 bytes

作标记的区块实际上被认为是一个固定的字节序列:
0x52 0x61 0x72 0x21 0x1a 0x07 0x00


档案文件头部 ( MAIN_HEAD )

HEAD_CRC HEAD_TYPE 区域所保留的CRC
2 字节

HEAD_TYPE 区块属性: 0x73
1 字节

HEAD_FLAGS 标记位:
2 字节
                0x01  卷属性(档案文件卷)
                0x02  当前档案文件注释
                0x04  档案文件锁定属性
                0x08  固实档案
                0x10  未使用的
                0x20  当前可信赖信息

                其它字位为内部使用所保留

HEAD_SIZE       包含档案注释的档案文件头部的大小
2 字节

RESERVED1       保留
2 字节

RESERVED2       保留
4 字节


注释块(Comment block)   当 (HEAD_FLAGS & 0x02) != 0 时有效

文件头(File header (在档案文件中的文件))

HEAD_CRC 从 HEAD_TYPE 到 FILEATTR 和文件名的CRC验证
2 字节

HEAD_TYPE       区块属性: 0x74
1 字节

HEAD_FLAGS      标记位:
2 字节
                0x01 - 上一卷文件延续
                0x02 - 下一卷文件待续
                0x04 - 由密码加密的文件
                0x08 - 文件注释
                0x10 - 使用上一个文件的信息(固定标记)
                       (适用于RAR2.0和以后)

                位   7 6 5 (适用于RAR2.0和以后)

                     0 0 0    - 字典大小 64 Kb
                     0 0 1    - 字典大小 128 Kb
                     0 1 0    - 字典大小 256 Kb
                     0 1 1    - 字典大小 512 Kb
                     1 0 0    - 字典大小 1024 Kb
                     1 0 1    - 保留
                     1 1 0    - 保留
                     1 1 1    - 目录标志

                (HEAD_FLAGS & 0x8000) == 1, 因为完整区块大小为HEAD_SIZE + PACK_SIZE

HEAD_SIZE       文件头包含文件名和注释的完整占用空间大小
2 字节

PACK_SIZE       压缩后文件大小
4 字节

UNP_SIZE        未压缩文件大小
4 字节

HOST_OS         档案文件适用的操作系统
1 字节                 0 - MS DOS
                       1 - OS/2
                       2 - Win32
                       3 - Unix

FILE_CRC        文件 CRC
4 字节

FTIME           时间和日期,MS DOS标准格式
4 字节

UNP_VER         解包文件所需要(最低的)RAR版本
1 字节

METHOD          装包方式
1 字节

NAME_SIZE       文件名占用空间大小
2 字节

ATTR            文件属性
4 字节

FILE_NAME       文件名- 符合NAME_SIZE标记的字符串

注释块 (Comment block) 当 (HEAD_FLAGS & 0x08) != 0 时有效

 

注释快(Comment block)

HEAD_CRC        从 HEAD_TYPE 到 COMM_CRC 的CRC
2 字节

HEAD_TYPE       区块属性: 0x75
1 字节

HEAD_FLAGS      标志位
2 字节

HEAD_SIZE       注释头大小+注释大小
2 字节

UNP_SIZE        未压缩注释大小
2 字节

UNP_VER         解包文件所需要(最低的)RAR版本
1 字节

METHOD          装包方式
1 字节

COMM_CRC        注释 CRC
2 字节

COMMENT         注释文本

 

额外信息区块(Extra info block)

HEAD_CRC        区块 CRC
2 字节

HEAD_TYPE       区块属性: 0x76
1 字节

HEAD_FLAGS      标志位
2 字节

HEAD_SIZE       区块总大小
2 字节

INFO            其它数据


补充区块(Subblock)

档案文件中的一个对象 (区块或区块头部) 可以跟随一个补充区块(Subblock)。
该补充区块(Subblock)从属于主对象,当档案文件被更新时,补充区块可以被移除
或者转移到新的档案文件中。

补充区块(subblock)由以下区域组成:

HEAD_CRC        区块 CRC
2 字节

HEAD_TYPE       区块属性: 0x77
1 字节

HEAD_FLAGS      标志位
2 字节
                (HEAD_FLAGS & 0x8000) == 1, 因为完整区块的大小为HEAD_SIZE + DATA_SIZE

HEAD_SIZE       总区块大小
2 字节

DATA_SIZE       总数据大小
4 字节

SUB_TYPE        补充区块(Subblock)类型
2 字节

RESERVED        必须为 0
1 字节

其他区域(Other fields)           其它区域取决于补充区块(subblock)类型


OS/2系统 补充区块(subblock)延伸属性(Extended attributes)

HEAD_CRC        区块 CRC
2 字节

HEAD_TYPE       区块属性: 0x77
1 字节
HEAD_FLAGS      标志位
2 字节
                (HEAD_FLAGS & 0x8000) == 1, 因为完整区块的大小为HEAD_SIZE + DATA_SIZE

HEAD_SIZE       总区块大小
2 字节

DATA_SIZE       总数据大小(包含延伸属性(Extended attributes)大小)
4 字节
SUB_TYPE        0x100
2 字节

RESERVED        必须为 0
1 字节

UNP_SIZE        未压缩延伸属性大小
4 字节

UNP_VER         解包文件所需要(最低的)RAR版本
1 字节

METHOD          装包方式
1 字节

EA_CRC          延伸属性(Extended attributes) CRC
4 字节


======================================
=============         操作说明         ============
======================================

   1. 为了处理SFX档案文件你需要跳过SFX模块在档案文件中寻找 作标记的区块(marker block)这个环节。
(因为)在SFX模块自身中并没有作标记的区块(marker block)序列(0x52 0x61 0x72 0x21 0x1a 0x07 0x00)。

   2. CRC验证使用标准多项式(standard polynomial)计算0xEDB88320,在CRC储存空间
低于4字节的情况下,仅仅使用低字节。

   3. 装包方式编码:
         0x30 - 仅储存
         0x31 - 最快压缩
         0x32 - 较快压缩
         0x33 - 标准压缩
         0x34 - 较好压缩
         0x35 - 最好压缩
   4. 解包文件所需要(最低的)RAR版本的编码方式为10 *主版本(Major version)+ 小版本(minor version)。

原创粉丝点击