misc/libphysfs/lzma/7zFormat.txt
branchui-scaling
changeset 15283 c4fd2813b127
parent 13390 0135e64c6c66
parent 15279 7ab5cf405686
child 15663 d92eeb468dad
equal deleted inserted replaced
13390:0135e64c6c66 15283:c4fd2813b127
     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