9e052883 |
1 | 7z Format description (18.06)\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 = 4\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 | REAL_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 |