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