e1cf7380d24989eb14a0b37aa26de22d588d6e11
[physicsfs] / lzma / 7zFormat.txt
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