Packaging library
[platform/upstream/7zip.git] / DOC / 7zFormat.txt
1 7z Format description (4.59)\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 = kCTime\r
157 0x13 = kATime\r
158 0x14 = kMTime\r
159 0x15 = kWinAttributes\r
160 0x16 = kComment\r
161 \r
162 0x17 = kEncodedHeader\r
163 \r
164 0x18 = kStartPos\r
165 0x19 = kDummy\r
166 \r
167 \r
168 7z format headers\r
169 -----------------\r
170 \r
171 SignatureHeader\r
172 ~~~~~~~~~~~~~~~\r
173   BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};\r
174 \r
175   ArchiveVersion\r
176   {\r
177     BYTE Major;   // now = 0\r
178     BYTE Minor;   // now = 2\r
179   };\r
180 \r
181   UINT32 StartHeaderCRC;\r
182 \r
183   StartHeader\r
184   {\r
185     REAL_UINT64 NextHeaderOffset\r
186     REAL_UINT64 NextHeaderSize\r
187     UINT32 NextHeaderCRC\r
188   }\r
189 \r
190 \r
191 ...........................\r
192 \r
193 \r
194 ArchiveProperties\r
195 ~~~~~~~~~~~~~~~~~\r
196 BYTE NID::kArchiveProperties (0x02)\r
197 for (;;)\r
198 {\r
199   BYTE PropertyType;\r
200   if (aType == 0)\r
201     break;\r
202   UINT64 PropertySize;\r
203   BYTE PropertyData[PropertySize];\r
204 }\r
205 \r
206 \r
207 Digests (NumStreams)\r
208 ~~~~~~~~~~~~~~~~~~~~~\r
209   BYTE AllAreDefined\r
210   if (AllAreDefined == 0)\r
211   {\r
212     for(NumStreams)\r
213       BIT Defined\r
214   }\r
215   UINT32 CRCs[NumDefined]\r
216 \r
217 \r
218 PackInfo\r
219 ~~~~~~~~~~~~\r
220   BYTE NID::kPackInfo  (0x06)\r
221   UINT64 PackPos\r
222   UINT64 NumPackStreams\r
223 \r
224   []\r
225   BYTE NID::kSize    (0x09)\r
226   UINT64 PackSizes[NumPackStreams]\r
227   []\r
228 \r
229   []\r
230   BYTE NID::kCRC      (0x0A)\r
231   PackStreamDigests[NumPackStreams]\r
232   []\r
233 \r
234   BYTE NID::kEnd\r
235 \r
236 \r
237 Folder\r
238 ~~~~~~\r
239   UINT64 NumCoders;\r
240   for (NumCoders)\r
241   {\r
242     BYTE \r
243     {\r
244       0:3 CodecIdSize\r
245       4:  Is Complex Coder\r
246       5:  There Are Attributes\r
247       6:  Reserved\r
248       7:  There are more alternative methods. (Not used anymore, must be 0).\r
249     } \r
250     BYTE CodecId[CodecIdSize]\r
251     if (Is Complex Coder)\r
252     {\r
253       UINT64 NumInStreams;\r
254       UINT64 NumOutStreams;\r
255     }\r
256     if (There Are Attributes)\r
257     {\r
258       UINT64 PropertiesSize\r
259       BYTE Properties[PropertiesSize]\r
260     }\r
261   }\r
262     \r
263   NumBindPairs = NumOutStreamsTotal - 1;\r
264 \r
265   for (NumBindPairs)\r
266   {\r
267     UINT64 InIndex;\r
268     UINT64 OutIndex;\r
269   }\r
270 \r
271   NumPackedStreams = NumInStreamsTotal - NumBindPairs;\r
272   if (NumPackedStreams > 1)\r
273     for(NumPackedStreams)\r
274     {\r
275       UINT64 Index;\r
276     };\r
277 \r
278 \r
279 \r
280 \r
281 Coders Info\r
282 ~~~~~~~~~~~\r
283 \r
284   BYTE NID::kUnPackInfo  (0x07)\r
285 \r
286 \r
287   BYTE NID::kFolder  (0x0B)\r
288   UINT64 NumFolders\r
289   BYTE External\r
290   switch(External)\r
291   {\r
292     case 0:\r
293       Folders[NumFolders]\r
294     case 1:\r
295       UINT64 DataStreamIndex\r
296   }\r
297 \r
298 \r
299   BYTE ID::kCodersUnPackSize  (0x0C)\r
300   for(Folders)\r
301     for(Folder.NumOutStreams)\r
302      UINT64 UnPackSize;\r
303 \r
304 \r
305   []\r
306   BYTE NID::kCRC   (0x0A)\r
307   UnPackDigests[NumFolders]\r
308   []\r
309 \r
310   \r
311 \r
312   BYTE NID::kEnd\r
313 \r
314 \r
315 \r
316 SubStreams Info\r
317 ~~~~~~~~~~~~~~\r
318   BYTE NID::kSubStreamsInfo; (0x08)\r
319 \r
320   []\r
321   BYTE NID::kNumUnPackStream; (0x0D)\r
322   UINT64 NumUnPackStreamsInFolders[NumFolders];\r
323   []\r
324 \r
325 \r
326   []\r
327   BYTE NID::kSize  (0x09)\r
328   UINT64 UnPackSizes[]\r
329   []\r
330 \r
331 \r
332   []\r
333   BYTE NID::kCRC  (0x0A)\r
334   Digests[Number of streams with unknown CRC]\r
335   []\r
336 \r
337   \r
338   BYTE NID::kEnd\r
339 \r
340 \r
341 Streams Info\r
342 ~~~~~~~~~~~~\r
343 \r
344   []\r
345   PackInfo\r
346   []\r
347 \r
348 \r
349   []\r
350   CodersInfo\r
351   []\r
352 \r
353 \r
354   []\r
355   SubStreamsInfo\r
356   []\r
357 \r
358   BYTE NID::kEnd\r
359 \r
360 \r
361 FilesInfo\r
362 ~~~~~~~~~\r
363   BYTE NID::kFilesInfo;  (0x05)\r
364   UINT64 NumFiles\r
365 \r
366   for (;;)\r
367   {\r
368     BYTE PropertyType;\r
369     if (aType == 0)\r
370       break;\r
371 \r
372     UINT64 Size;\r
373 \r
374     switch(PropertyType)\r
375     {\r
376       kEmptyStream:   (0x0E)\r
377         for(NumFiles)\r
378           BIT IsEmptyStream\r
379 \r
380       kEmptyFile:     (0x0F)\r
381         for(EmptyStreams)\r
382           BIT IsEmptyFile\r
383 \r
384       kAnti:          (0x10)\r
385         for(EmptyStreams)\r
386           BIT IsAntiFile\r
387       \r
388       case kCTime: (0x12)\r
389       case kATime: (0x13)\r
390       case kMTime: (0x14)\r
391         BYTE AllAreDefined\r
392         if (AllAreDefined == 0)\r
393         {\r
394           for(NumFiles)\r
395             BIT TimeDefined\r
396         }\r
397         BYTE External;\r
398         if(External != 0)\r
399           UINT64 DataIndex\r
400         []\r
401         for(Definded Items)\r
402           UINT64 Time\r
403         []\r
404       \r
405       kNames:     (0x11)\r
406         BYTE External;\r
407         if(External != 0)\r
408           UINT64 DataIndex\r
409         []\r
410         for(Files)\r
411         {\r
412           wchar_t Names[NameSize];\r
413           wchar_t 0;\r
414         }\r
415         []\r
416 \r
417       kAttributes:  (0x15)\r
418         BYTE AllAreDefined\r
419         if (AllAreDefined == 0)\r
420         {\r
421           for(NumFiles)\r
422             BIT AttributesAreDefined\r
423         }\r
424         BYTE External;\r
425         if(External != 0)\r
426           UINT64 DataIndex\r
427         []\r
428         for(Definded Attributes)\r
429           UINT32 Attributes\r
430         []\r
431     }\r
432   }\r
433 \r
434 \r
435 Header\r
436 ~~~~~~\r
437   BYTE NID::kHeader (0x01)\r
438 \r
439   []\r
440   ArchiveProperties\r
441   []\r
442 \r
443   []\r
444   BYTE NID::kAdditionalStreamsInfo; (0x03)\r
445   StreamsInfo\r
446   []\r
447 \r
448   []\r
449   BYTE NID::kMainStreamsInfo;    (0x04)\r
450   StreamsInfo\r
451   []\r
452 \r
453   []\r
454   FilesInfo\r
455   []\r
456 \r
457   BYTE NID::kEnd\r
458 \r
459 \r
460 HeaderInfo\r
461 ~~~~~~~~~~\r
462   []\r
463   BYTE NID::kEncodedHeader; (0x17)\r
464   StreamsInfo for Encoded Header\r
465   []\r
466 \r
467 \r
468 ---\r
469 End of document\r