RAR 文檔格式

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   *   主版本   +   副版本。  
   
  算法版的資料,不過因爲壓縮方法是保密的,這個也只是文件格式而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章