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) | 注释 |
---|---|---|
头CRC32 | 4 | |
头大小 | vint | |
头类型 | vint | |
头flag | vint | |
扩展区大小 | vint | 当头flag 0x01设置时才存在 |
数据区大小 | vint | 当头flag 0x02设置时才存在 |
扩展区 | 大小由扩展区大小 定义 | |
数据区 | vint | 大小由数据区大小 定义 |
注:
头类型
,头类型是全局通用的,一共有一下几种类型:- 1:主存档头
- 2:文件头
- 3:服务头
- 4:归档加密头
- 5:归档结束头
头flag
,与头类型一样,全局通用:- 0x01:如果设置,则
扩展区大小
存在 - 0x02:如果设置,则
数据区大小
存在 - 0x04:如果设置,则跳过该块,开始扫描下一个块
- 0x08:数据区从先前的一个卷继续
- 0x10:数据区从下一个卷继续
- 0x20:块取决于前一个文件块
- 0x40:如果操作系统被修改,则保留子块。
- 0x01:如果设置,则
注:RAR的flag计算方式也与其他的不同,像ZIP文件是通过Bit来实现flag的,而RAR是通过叠加来计算flag位的。例如:0x05=0x04+0x01
主归档头
字段 | 大小(bytes) | 注释 |
---|---|---|
头CRC32 | 4 | |
头大小 | vint | |
头类型 | vint | 固定值1 |
头flag | vint | 查见通用归档头 |
扩展区大小 | vint | 当头flag 0x01设置时才存在 |
归档flag | vint | |
卷编号 | vint | 当归档flag 0x02设置时才存在 |
扩展区 | 大小由扩展区大小 定义 |
注:
归档flag
:- 0x01:如果设置,则本归档是多卷中的一部分,也就是说存在多个RAR包
- 0x02:如果设置,则
卷编号
存在 - 0x04:Solid archive(谷歌翻译:固体归档)
- 0x08:如果设置,则恢复记录存在
- 0x10:已锁定归档
文件头
字段 | 大小(bytes) | 注释 |
---|---|---|
头CRC32 | 4 | |
头大小 | vint | |
头类型 | vint | 固定值2 |
头flag | vint | |
扩展区大小 | vint | 当头flag 0x01设置时才存在 |
数据区大小 | vint | 当头flag 0x02设置时才存在 |
文件flag | vint | |
未解压大小 | vint | |
属性 | vint | |
时间 | 4 | 当文件flag 0x02设置时才存在 |
数据区CRC32 | 4 | 当文件flag 0x04设置时才存在 |
压缩信息 | vint | |
操作系统 | vint | |
文件名长度 | vint | |
文件名 | 大小由文件名长度 定义 | |
扩展区 | 大小由扩展区大小 定义 | |
数据区 | vint | 大小由数据区大小 定义 |
注:
头flag
:- 0x01:此文件头为目录
- 0x02:如果设置,则
时间
存在 - 0x04:如果设置,则
CRC32
存在 - 0x08:解压大小未知
压缩信息
:- Bit 1~6:压缩算法版本
- Bit 7:定义solid标志,主要与压缩字典相关
- Bit 8~10:定义压缩的方法,0~5,0为未压缩
- Bit 11~14:定义压缩字典的大小,0=128k,1=256k,2=512k,以此类推
操作系统
:- 0x00:Windows
- 0x01:Unix
样例
实例见附件:
本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【39G4JTQV】获取授权信息。