blob: f084c05d608a2b75c2df7fefb1fdcd27deb149c1 [file] [log] [blame]
repo syncbaa38582013-07-26 17:53:31 -070017z Format description (2.30 Beta 25)
2-----------------------------------
3
4This file contains description of 7z archive format.
57z archive can contain files compressed with any method.
6See "Methods.txt" for description for defined compressing methods.
7
8
9Format structure Overview
10-------------------------
11
12Some fields can be optional.
13
14Archive structure
15~~~~~~~~~~~~~~~~~
16SignatureHeader
17[PackedStreams]
18[PackedStreamsForHeaders]
19[
20 Header
21 or
22 {
23 Packed Header
24 HeaderInfo
25 }
26]
27
28
29
30Header 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
91HeaderInfo structure
92~~~~~~~~~~~~~~~~~~~~
93{
94 (Same as in AdditionalStreams)
95}
96
97
98
99Notes about Notation and encoding
100---------------------------------
101
1027z uses little endian encoding.
103
1047z archive format has optional headers that are marked as
105[]
106Header
107[]
108
109REAL_UINT64 means real UINT64.
110
111UINT64 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
126Property IDs
127------------
128
1290x00 = kEnd,
130
1310x01 = kHeader,
132
1330x02 = kArchiveProperties,
134
1350x03 = kAdditionalStreamsInfo,
1360x04 = kMainStreamsInfo,
1370x05 = kFilesInfo,
138
1390x06 = kPackInfo,
1400x07 = kUnPackInfo,
1410x08 = kSubStreamsInfo,
142
1430x09 = kSize,
1440x0A = kCRC,
145
1460x0B = kFolder,
147
1480x0C = kCodersUnPackSize,
1490x0D = kNumUnPackStream,
150
1510x0E = kEmptyStream,
1520x0F = kEmptyFile,
1530x10 = kAnti,
154
1550x11 = kName,
1560x12 = kCreationTime,
1570x13 = kLastAccessTime,
1580x14 = kLastWriteTime,
1590x15 = kWinAttributes,
1600x16 = kComment,
161
1620x17 = kEncodedHeader,
163
164
1657z format headers
166-----------------
167
168SignatureHeader
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
191ArchiveProperties
192~~~~~~~~~~~~~~~~~
193BYTE NID::kArchiveProperties (0x02)
194for (;;)
195{
196 BYTE PropertyType;
197 if (aType == 0)
198 break;
199 UINT64 PropertySize;
200 BYTE PropertyData[PropertySize];
201}
202
203
204Digests (NumStreams)
205~~~~~~~~~~~~~~~~~~~~~
206 BYTE AllAreDefined
207 if (AllAreDefined == 0)
208 {
209 for(NumStreams)
210 BIT Defined
211 }
212 UINT32 CRCs[NumDefined]
213
214
215PackInfo
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
234Folder
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
283Coders 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
318SubStreams 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
343Streams 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
363FilesInfo
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
437Header
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
462HeaderInfo
463~~~~~~~~~~
464 []
465 BYTE NID::kEncodedHeader; (0x17)
466 StreamsInfo for Encoded Header
467 []
468
469
470---
471End of document