Home | History | Annotate | Download | only in lzma
      1 7z Format description (2.30 Beta 25)
      2 -----------------------------------
      3 
      4 This file contains description of 7z archive format. 
      5 7z archive can contain files compressed with any method.
      6 See "Methods.txt" for description for defined compressing methods.
      7 
      8 
      9 Format structure Overview
     10 -------------------------
     11 
     12 Some fields can be optional.
     13 
     14 Archive structure
     15 ~~~~~~~~~~~~~~~~~  
     16 SignatureHeader
     17 [PackedStreams]
     18 [PackedStreamsForHeaders]
     19 [
     20   Header 
     21   or 
     22   {
     23     Packed Header
     24     HeaderInfo
     25   }
     26 ]
     27 
     28 
     29 
     30 Header structure
     31 ~~~~~~~~~~~~~~~~  
     32 {
     33   ArchiveProperties
     34   AdditionalStreams
     35   {
     36     PackInfo
     37     {
     38       PackPos
     39       NumPackStreams
     40       Sizes[NumPackStreams]
     41       CRCs[NumPackStreams]
     42     }
     43     CodersInfo
     44     {
     45       NumFolders
     46       Folders[NumFolders]
     47       {
     48         NumCoders
     49         CodersInfo[NumCoders]
     50         {
     51           ID
     52           NumInStreams;
     53           NumOutStreams;
     54           PropertiesSize
     55           Properties[PropertiesSize]
     56         }
     57         NumBindPairs
     58         BindPairsInfo[NumBindPairs]
     59         {
     60           InIndex;
     61           OutIndex;
     62         }
     63         PackedIndices
     64       }
     65       UnPackSize[Folders][Folders.NumOutstreams]
     66       CRCs[NumFolders]
     67     }
     68     SubStreamsInfo
     69     {
     70       NumUnPackStreamsInFolders[NumFolders];
     71       UnPackSizes[]
     72       CRCs[]
     73     }
     74   }
     75   MainStreamsInfo
     76   {
     77     (Same as in AdditionalStreams)
     78   }
     79   FilesInfo
     80   {
     81     NumFiles
     82     Properties[]
     83     {
     84       ID
     85       Size
     86       Data
     87     }
     88   }
     89 }
     90 
     91 HeaderInfo structure
     92 ~~~~~~~~~~~~~~~~~~~~
     93 {
     94   (Same as in AdditionalStreams)
     95 }
     96 
     97 
     98 
     99 Notes about Notation and encoding
    100 ---------------------------------
    101 
    102 7z uses little endian encoding.
    103 
    104 7z archive format has optional headers that are marked as
    105 []
    106 Header
    107 []
    108 
    109 REAL_UINT64 means real UINT64.
    110 
    111 UINT64 means real UINT64 encoded with the following scheme:
    112 
    113   Size of encoding sequence depends from first byte:
    114   First_Byte  Extra_Bytes        Value
    115   (binary)   
    116   0xxxxxxx               : ( xxxxxxx           )
    117   10xxxxxx    BYTE y[1]  : (  xxxxxx << (8 * 1)) + y
    118   110xxxxx    BYTE y[2]  : (   xxxxx << (8 * 2)) + y
    119   ...
    120   1111110x    BYTE y[6]  : (       x << (8 * 6)) + y
    121   11111110    BYTE y[7]  :                         y
    122   11111111    BYTE y[8]  :                         y
    123 
    124 
    125 
    126 Property IDs
    127 ------------
    128 
    129 0x00 = kEnd,
    130 
    131 0x01 = kHeader,
    132 
    133 0x02 = kArchiveProperties,
    134     
    135 0x03 = kAdditionalStreamsInfo,
    136 0x04 = kMainStreamsInfo,
    137 0x05 = kFilesInfo,
    138     
    139 0x06 = kPackInfo,
    140 0x07 = kUnPackInfo,
    141 0x08 = kSubStreamsInfo,
    142 
    143 0x09 = kSize,
    144 0x0A = kCRC,
    145 
    146 0x0B = kFolder,
    147 
    148 0x0C = kCodersUnPackSize,
    149 0x0D = kNumUnPackStream,
    150 
    151 0x0E = kEmptyStream,
    152 0x0F = kEmptyFile,
    153 0x10 = kAnti,
    154 
    155 0x11 = kName,
    156 0x12 = kCreationTime,
    157 0x13 = kLastAccessTime,
    158 0x14 = kLastWriteTime,
    159 0x15 = kWinAttributes,
    160 0x16 = kComment,
    161 
    162 0x17 = kEncodedHeader,
    163 
    164 
    165 7z format headers
    166 -----------------
    167 
    168 SignatureHeader
    169 ~~~~~~~~~~~~~~~
    170   BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
    171 
    172   ArchiveVersion
    173   {
    174     BYTE Major;   // now = 0
    175     BYTE Minor;   // now = 2
    176   };
    177 
    178   UINT32 StartHeaderCRC;
    179 
    180   StartHeader
    181   {
    182     REAL_UINT64 NextHeaderOffset
    183     REAL_UINT64 NextHeaderSize
    184     UINT32 NextHeaderCRC
    185   }
    186 
    187 
    188 ...........................
    189 
    190 
    191 ArchiveProperties
    192 ~~~~~~~~~~~~~~~~~
    193 BYTE NID::kArchiveProperties (0x02)
    194 for (;;)
    195 {
    196   BYTE PropertyType;
    197   if (aType == 0)
    198     break;
    199   UINT64 PropertySize;
    200   BYTE PropertyData[PropertySize];
    201 }
    202 
    203 
    204 Digests (NumStreams)
    205 ~~~~~~~~~~~~~~~~~~~~~
    206   BYTE AllAreDefined
    207   if (AllAreDefined == 0)
    208   {
    209     for(NumStreams)
    210       BIT Defined
    211   }
    212   UINT32 CRCs[NumDefined]
    213 
    214 
    215 PackInfo
    216 ~~~~~~~~~~~~
    217   BYTE NID::kPackInfo  (0x06)
    218   UINT64 PackPos
    219   UINT64 NumPackStreams
    220 
    221   []
    222   BYTE NID::kSize    (0x09)
    223   UINT64 PackSizes[NumPackStreams]
    224   []
    225 
    226   []
    227   BYTE NID::kCRC      (0x0A)
    228   PackStreamDigests[NumPackStreams]
    229   []
    230 
    231   BYTE NID::kEnd
    232 
    233 
    234 Folder
    235 ~~~~~~
    236   UINT64 NumCoders;
    237   for (NumCoders)
    238   {
    239     BYTE 
    240     {
    241       0:3 DecompressionMethod.IDSize
    242       4:
    243         0 - IsSimple
    244         1 - Is not simple
    245       5:
    246         0 - No Attributes
    247         1 - There Are Attributes
    248       7:
    249         0 - Last Method in Alternative_Method_List
    250         1 - There are more alternative methods
    251     } 
    252     BYTE DecompressionMethod.ID[DecompressionMethod.IDSize]
    253     if (!IsSimple)
    254     {
    255       UINT64 NumInStreams;
    256       UINT64 NumOutStreams;
    257     }
    258     if (DecompressionMethod[0] != 0)
    259     {
    260       UINT64 PropertiesSize
    261       BYTE Properties[PropertiesSize]
    262     }
    263   }
    264     
    265   NumBindPairs = NumOutStreamsTotal - 1;
    266 
    267   for (NumBindPairs)
    268   {
    269     UINT64 InIndex;
    270     UINT64 OutIndex;
    271   }
    272 
    273   NumPackedStreams = NumInStreamsTotal - NumBindPairs;
    274   if (NumPackedStreams > 1)
    275     for(NumPackedStreams)
    276     {
    277       UINT64 Index;
    278     };
    279 
    280 
    281 
    282 
    283 Coders Info
    284 ~~~~~~~~~~~
    285 
    286   BYTE NID::kUnPackInfo  (0x07)
    287 
    288 
    289   BYTE NID::kFolder  (0x0B)
    290   UINT64 NumFolders
    291   BYTE External
    292   switch(External)
    293   {
    294     case 0:
    295       Folders[NumFolders]
    296     case 1:
    297       UINT64 DataStreamIndex
    298   }
    299 
    300 
    301   BYTE ID::kCodersUnPackSize  (0x0C)
    302   for(Folders)
    303     for(Folder.NumOutStreams)
    304      UINT64 UnPackSize;
    305 
    306 
    307   []
    308   BYTE NID::kCRC   (0x0A)
    309   UnPackDigests[NumFolders]
    310   []
    311 
    312   
    313 
    314   BYTE NID::kEnd
    315 
    316 
    317 
    318 SubStreams Info
    319 ~~~~~~~~~~~~~~
    320   BYTE NID::kSubStreamsInfo; (0x08)
    321 
    322   []
    323   BYTE NID::kNumUnPackStream; (0x0D)
    324   UINT64 NumUnPackStreamsInFolders[NumFolders];
    325   []
    326 
    327 
    328   []
    329   BYTE NID::kSize  (0x09)
    330   UINT64 UnPackSizes[]
    331   []
    332 
    333 
    334   []
    335   BYTE NID::kCRC  (0x0A)
    336   Digests[Number of streams with unknown CRC]
    337   []
    338 
    339   
    340   BYTE NID::kEnd
    341 
    342 
    343 Streams Info
    344 ~~~~~~~~~~~~
    345 
    346   []
    347   PackInfo
    348   []
    349 
    350 
    351   []
    352   CodersInfo
    353   []
    354 
    355 
    356   []
    357   SubStreamsInfo
    358   []
    359 
    360   BYTE NID::kEnd
    361 
    362 
    363 FilesInfo
    364 ~~~~~~~~~
    365   BYTE NID::kFilesInfo;  (0x05)
    366   UINT64 NumFiles
    367 
    368   for (;;)
    369   {
    370     BYTE PropertyType;
    371     if (aType == 0)
    372       break;
    373 
    374     UINT64 Size;
    375 
    376     switch(PropertyType)
    377     {
    378       kEmptyStream:   (0x0E)
    379         for(NumFiles)
    380           BIT IsEmptyStream
    381 
    382       kEmptyFile:     (0x0F)
    383         for(EmptyStreams)
    384           BIT IsEmptyFile
    385 
    386       kAnti:          (0x10)
    387         for(EmptyStreams)
    388           BIT IsAntiFile
    389       
    390       case kCreationTime:   (0x12)
    391       case kLastAccessTime: (0x13)
    392       case kLastWriteTime:  (0x14)
    393         BYTE AllAreDefined
    394         if (AllAreDefined == 0)
    395         {
    396           for(NumFiles)
    397             BIT TimeDefined
    398         }
    399         BYTE External;
    400         if(External != 0)
    401           UINT64 DataIndex
    402         []
    403         for(Definded Items)
    404           UINT32 Time
    405         []
    406       
    407       kNames:     (0x11)
    408         BYTE External;
    409         if(External != 0)
    410           UINT64 DataIndex
    411         []
    412         for(Files)
    413         {
    414           wchar_t Names[NameSize];
    415           wchar_t 0;
    416         }
    417         []
    418 
    419       kAttributes:  (0x15)
    420         BYTE AllAreDefined
    421         if (AllAreDefined == 0)
    422         {
    423           for(NumFiles)
    424             BIT AttributesAreDefined
    425         }
    426         BYTE External;
    427         if(External != 0)
    428           UINT64 DataIndex
    429         []
    430         for(Definded Attributes)
    431           UINT32 Attributes
    432         []
    433     }
    434   }
    435 
    436 
    437 Header
    438 ~~~~~~
    439   BYTE NID::kHeader (0x01)
    440 
    441   []
    442   ArchiveProperties
    443   []
    444 
    445   []
    446   BYTE NID::kAdditionalStreamsInfo; (0x03)
    447   StreamsInfo
    448   []
    449 
    450   []
    451   BYTE NID::kMainStreamsInfo;    (0x04)
    452   StreamsInfo
    453   []
    454 
    455   []
    456   FilesInfo
    457   []
    458 
    459   BYTE NID::kEnd
    460 
    461 
    462 HeaderInfo
    463 ~~~~~~~~~~
    464   []
    465   BYTE NID::kEncodedHeader; (0x17)
    466   StreamsInfo for Encoded Header
    467   []
    468 
    469 
    470 ---
    471 End of document
    472