RAR的所有数值存放都将使用小端序模式,通常使用的编辑器都是大端序的,在查看的时候需要特别注意!!

RAR5的宏观构造如下:

  • RAR5文件头(0x526172211A070100)+
  • 主归档头
  • 文件信息
  • RAR5文件结尾(0x1D77565103050400)

当然这里还有额外的字段,这里就不展示了,详细的可以查看官方文档:RAR 5.0 archive format

动态大小

RAR5的大部分参数数据占用的块大小是不固定的,需要通过标志位判断数值占用的位数。同时这样也能尽可能的减少文件的占用。

这里就来介绍一下动态大小类型,vint

vint的大小占用在1~10bytes之间,通过第8位来进行判断,0为截止标识,1为延续标识。
同时vint表示的大小最多为64位整数,可以使用10bytes来表示。

这里举一个例子来说明vint是如何计算数值的:

  • 0x9A10

因为使用的是小端序模式,所以首先我们需要更换一下两个数据的位置,它就变成了0x109A,然后我们需要再转换为二进制b0001 0000 1001 1010
这里我们去掉延续标志位和空余位,那么其结果也就是b1000 1001 1010,换算成十六进制也就是0x81A
大致过程可以看下图:
转换过程

通用归档头

字段大小(bytes)注释
头CRC324
头大小vint
头类型vint
头flagvint
扩展区大小vint头flag 0x01设置时才存在
数据区大小vint头flag0x02设置时才存在
扩展区 大小由扩展区大小定义
数据区vint大小由数据区大小定义

注:

  1. 头类型,头类型是全局通用的,一共有一下几种类型:

    • 1:主存档头
    • 2:文件头
    • 3:服务头
    • 4:归档加密头
    • 5:归档结束头
  2. 头flag,与头类型一样,全局通用:

    • 0x01:如果设置,则扩展区大小存在
    • 0x02:如果设置,则数据区大小存在
    • 0x04:如果设置,则跳过该块,开始扫描下一个块
    • 0x08:数据区从先前的一个卷继续
    • 0x10:数据区从下一个卷继续
    • 0x20:块取决于前一个文件块
    • 0x40:如果操作系统被修改,则保留子块。

注:RAR的flag计算方式也与其他的不同,像ZIP文件是通过Bit来实现flag的,而RAR是通过叠加来计算flag位的。例如:0x05=0x04+0x01

主归档头

字段大小(bytes)注释
头CRC324
头大小vint
头类型vint固定值1
头flagvint查见通用归档头
扩展区大小vint头flag0x01设置时才存在
归档flagvint
卷编号vint归档flag0x02设置时才存在
扩展区 大小由扩展区大小定义

注:

  1. 归档flag

    • 0x01:如果设置,则本归档是多卷中的一部分,也就是说存在多个RAR包
    • 0x02:如果设置,则卷编号存在
    • 0x04:Solid archive(谷歌翻译:固体归档)
    • 0x08:如果设置,则恢复记录存在
    • 0x10:已锁定归档

文件头

字段大小(bytes)注释
头CRC324
头大小vint
头类型vint固定值2
头flagvint
扩展区大小vint头flag0x01设置时才存在
数据区大小vint头flag0x02设置时才存在
文件flagvint
未解压大小vint
属性vint
时间4文件flag0x02设置时才存在
数据区CRC324文件flag0x04设置时才存在
压缩信息vint
操作系统vint
文件名长度vint
文件名 大小由文件名长度定义
扩展区 大小由扩展区大小定义
数据区vint大小由数据区大小定义

注:

  1. 头flag

    • 0x01:此文件头为目录
    • 0x02:如果设置,则时间存在
    • 0x04:如果设置,则CRC32存在
    • 0x08:解压大小未知
  2. 压缩信息

    • Bit 1~6:压缩算法版本
    • Bit 7:定义solid标志,主要与压缩字典相关
    • Bit 8~10:定义压缩的方法,0~5,0为未压缩
    • Bit 11~14:定义压缩字典的大小,0=128k,1=256k,2=512k,以此类推
  3. 操作系统

    • 0x00:Windows
    • 0x01:Unix

样例

实例见附件
wxHexeditor 样例

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【39G4JTQV】获取授权信息。

最后修改:2020 年 07 月 11 日 09 : 09 AM
如果觉得我的文章对你有用,请随意赞赏