RAR 版本 3.00 - 技術信息
~~~~~~~~~~~~~~~~~~~~~~~~
下列壓縮文件格式描述僅對版本 1.50 之後有效
=========================================
RAR 壓縮文件格式
=========================================
壓縮文件由可變長度的塊組成。這些塊的順序可以變化,但是第一塊必須是一個在壓
縮文件頭後的標記塊。
每一塊由下列結構開始:
HEAD_CRC 2 字節 所有塊或塊部分的 CRC
HEAD_TYPE 1 字節 塊類型
HEAD_FLAGS 2 字節 塊標記
HEAD_SIZE 2 字節 塊大小
ADD_SIZE 4 字節 可選結構 - 增加塊大小
只有 (HEAD_FLAGS & 0x8000) != 0 時 ADD_SIZE 才存在
如果 (HEAD_FLAGS & 0x8000) == 0 則總塊大小是 HEAD_SIZE,當
(HEAD_FLAGS & 0x8000) != 0 時,如果 ADD_SIZE 結構存在,則總塊大小是
HEAD_SIZE+ADD_SIZE。
在每一塊中 HEAD_FLAGS 的下列位都有相同的意義:
0x4000 - 如果設置,當更新時舊的 RAR 版本將忽略這個塊並刪除它。
如果清除,當更新時塊被複制到新的壓縮文件;
0x8000 - 如果設置,ADD_SIZE 結構存在,全部塊的大小是 HEAD_SIZE+ADD_SIZE。
公開的塊類型:
HEAD_TYPE=0x72 標記塊
HEAD_TYPE=0x73 壓縮文件頭
HEAD_TYPE=0x74 文件頭
HEAD_TYPE=0x75 註釋頭
HEAD_TYPE=0x76 舊風格的用戶身份信息
HEAD_TYPE=0x77 子塊
HEAD_TYPE=0x78 恢復紀錄
HEAD_TYPE=0x79 用戶身份信息
註釋塊實際上只在其它塊中使用,並不存在單獨的塊。
檔案處理由下列步驟組成:
1. 讀取和檢查標記塊
2. 讀取壓縮文件頭
3. 讀取或跳過 HEAD_SIZE-sizeof(MAIN_HEAD) 字節
4. 如果發現壓縮文件結尾則壓縮文件處理終止,否則讀取7字節到結構 HEAD_CRC,
HEAD_TYPE,HEAD_FLAGS,HEAD_SIZE 中。
5. 檢查 HEAD_TYPE。
if HEAD_TYPE==0x74
讀取文件頭 ( 開始的 7 字節必須讀取)
讀取或跳過 HEAD_SIZE-sizeof(FILE_HEAD) 字節
if (HEAD_FLAGS & 0x100)
讀取或跳過 HIGH_PACK_SIZE*0x100000000+PACK_SIZE 字節
else
讀取或跳過 PACK_SIZE 字節
else
讀取 corresponding HEAD_TYPE 塊:
讀取 HEAD_SIZE-7 字節
if (HEAD_FLAGS & 0x8000)
讀取 ADD_SIZE 字節
6. 繼續 4。
=====================================================================
塊格式
=====================================================================
標記塊 ( MARK_HEAD )
HEAD_CRC 總是 0x6152
2 字節
HEAD_TYPE 頭類型: 0x72
1 字節
HEAD_FLAGS 總是 0x1a21
2 字節
HEAD_SIZE 塊大小 = 0x0007
2 字節
標記塊實際上包含一個固定字節序列: 0x52 0x61 0x72 0x21 0x1a 0x07 0x00
壓縮文件頭 ( MAIN_HEAD )
HEAD_CRC HEAD_TYPE 到 RESERVED2 的 CRC 結構
2 字節
HEAD_TYPE 頭類型: 0x73
1 字節
HEAD_FLAGS 位標記:
2 字節
0x01 - 卷屬性 (壓縮文件卷)
0x02 - 壓縮文件註釋存在
0x04 - 壓縮文件鎖定屬性
0x08 - 固實屬性 (固實壓縮文件)
0x10 - 新的卷命名法則 (‘volname.partN.rar’)
0x20 - 用戶信息存在
0x40 - 恢復記錄存在
0x80 - 塊頭被加密
其中的其它位爲內部使用保留
HEAD_SIZE 檔案頭總大小(包括檔案註釋)
2 字節
RESERVED1 保留
2 字節
RESERVED2 保留
4 字節
如果 (HEAD_FLAGS & 0x02) != 0 則註釋塊存在
文件頭 (壓縮文件中的文件)
HEAD_CRC 從 HEAD_TYPE 到 FILEATTR 的 CRC 結構和文件名
2 字節
HEAD_TYPE 頭類型: 0x74
1 字節
HEAD_FLAGS 位標記:
2 字節
0x01 - 文件在前一卷中繼續
0x02 - 文件在後一卷中繼續
0x04 - 文件使用密碼加密
0x08 - 文件註釋存在
0x10 - 前一文件信息被使用(固實標記)
(對於 RAR 2.0 和以後版本)
7 6 5 位(對於 RAR 2.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 - 字典大小 2048 KB
1 1 0 - 字典大小 4096 KB
1 1 1 - 文件作爲字典
0x100 - HIGH_PACK_SIZE 和 HIGH_UNP_SIZE 結構存在。這些結構僅用
在非常大(大於 2GB)的文檔,對於小文件這些結構不存在。
0x200 - FILE_NAME 包含用 0 隔開的普通的和 Unicode 編碼的文件名。
所以 NAME_SIZE 結構長度等於普通文件名的長度加 Unicode
編碼文件名的長度再加1。
0x400 - 頭在文件名後包含附加的8位,它對於增加加密的安全性是必需
的。(所謂的‘Salt’)。
0x800 - 版本標記。他是老文件版本,版本號作爲‘;n’附加到文件名後。
0x8000 - 此位總被設置,所以完整的塊的大小是HEAD_SIZE + PACK_SIZE
(如果 0x100 位被設置,再加上 HIGH_PACK_SIZE)
HEAD_SIZE 文件頭的全部大小(包含文件名和註釋)
2 字節
PACK_SIZE 已壓縮文件大小
4 字節
UNP_SIZE 未壓縮文件大小
4 字節Top
HOST_OS 保存壓縮文件使用的操作系統
1 字節 0 - MS DOS
1 - OS/2
2 - Win32
3 - Unix
4 - Mac OS
5 - BeOS
FILE_CRC 文件 CRC
4 字節
FTIME MS DOS 標準格式的日期和時間
4 字節
UNP_VER 解壓縮文件所需要最低的 RAR 版本
1 字節
METHOD 壓縮方式
1 字節
NAME_SIZE 文件名大小
2 字節
ATTR 文件屬性
4 字節
HIGH_PACK_SIZE 壓縮文件大小 64 位值的高4字節。可選值,只有 HEAD_FLAGS 中的
4 字節 0x100 位被設置才存在。
HIGH_UNP_SIZE 未壓縮文件大小64位值的高4字節。可選值,只有 HEAD_FLAGS 中的
4 字節 0x100 位被設置才存在。
FILE_NAME 文件名 - NAME_SIZE 字節大小字符串
如果 (HEAD_FLAGS & 0x08) != 0 則註釋塊存在
註釋塊
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 註釋文本
擴展信息塊
HEAD_CRC 塊 CRC
2 字節
HEAD_TYPE 頭類型: 0x76
1 字節
HEAD_FLAGS 位標記
2 字節
HEAD_SIZE 總塊大小
2 字節
信息 其它數據
子塊
壓縮文件(塊或頭)中的項目可以解一個子塊。子塊依賴於上面的主項目。更新時子塊可以
被刪除或移動到壓縮文件的新版本中。
子塊包含下列結構:
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 子塊類型
2 字節
RESERVED 必須是 0
1 字節
其它結構 其它結構依賴於子塊類型
OS/2 擴展屬性子塊
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 0x100
2 字節
RESERVED 必須是 0
1 字節
UNP_SIZE 未壓縮的擴展屬性大小
4 字節
UNP_VER 解壓縮擴展屬性需要的最低 RAR 版本
1 字節
METHOD 壓縮方式
1 字節
EA_CRC 擴展屬性 CRC
4 字節
==========================================================================
應用程序注意事項
==========================================================================
1. 處理自解壓文件時,你需要在壓縮文件中搜索標記塊跳過自解壓模塊。自解壓
模塊本身沒有標記塊序列(0x52 0x61 0x72 0x21 0x1a 0x07 0x00)。
2. CRC 計算使用標準公式 0xEDB88320。由於 CRC 大小小於4字節,所以只使用低
位字節。
3. 壓縮編碼方式:
0x30 - 存儲
0x31 - 最快壓縮
0x32 - 快速壓縮
0x33 - 標準壓縮
0x34 - 較好壓縮
0x35 - 最好壓縮
4. 版本編碼方法 10 * 主版本 + 副版本。
算法版的資料,不過因爲壓縮方法是保密的,這個也只是文件格式而已。