Annotation of elwix/tools/oldlzma/7zFormat.txt, revision 1.1.1.1
1.1 misho 1: 7z Format description (2.30 Beta 25)
2: -----------------------------------
3:
4: This file contain descrition 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 it = 0
175: BYTE Minor; // now it = 1
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: while(true)
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: while(true)
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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>