1 7z Format description (4.59)
\r
2 ----------------------------
\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
9 Format structure Overview
\r
10 -------------------------
\r
12 Some fields can be optional.
\r
18 [PackedStreamsForHeaders]
\r
40 Sizes[NumPackStreams]
\r
41 CRCs[NumPackStreams]
\r
49 CodersInfo[NumCoders]
\r
55 Properties[PropertiesSize]
\r
58 BindPairsInfo[NumBindPairs]
\r
65 UnPackSize[Folders][Folders.NumOutstreams]
\r
70 NumUnPackStreamsInFolders[NumFolders];
\r
77 (Same as in AdditionalStreams)
\r
91 HeaderInfo structure
\r
92 ~~~~~~~~~~~~~~~~~~~~
\r
94 (Same as in AdditionalStreams)
\r
99 Notes about Notation and encoding
\r
100 ---------------------------------
\r
102 7z uses little endian encoding.
\r
104 7z archive format has optional headers that are marked as
\r
109 REAL_UINT64 means real UINT64.
\r
111 UINT64 means real UINT64 encoded with the following scheme:
\r
113 Size of encoding sequence depends from first byte:
\r
114 First_Byte Extra_Bytes Value
\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
120 1111110x BYTE y[6] : ( x << (8 * 6)) + y
\r
121 11111110 BYTE y[7] : y
\r
122 11111111 BYTE y[8] : y
\r
133 0x02 = kArchiveProperties
\r
135 0x03 = kAdditionalStreamsInfo
\r
136 0x04 = kMainStreamsInfo
\r
141 0x08 = kSubStreamsInfo
\r
148 0x0C = kCodersUnPackSize
\r
149 0x0D = kNumUnPackStream
\r
151 0x0E = kEmptyStream
\r
159 0x15 = kWinAttributes
\r
162 0x17 = kEncodedHeader
\r
173 BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
\r
177 BYTE Major; // now = 0
\r
178 BYTE Minor; // now = 2
\r
181 UINT32 StartHeaderCRC;
\r
185 REAL_UINT64 NextHeaderOffset
\r
186 REAL_UINT64 NextHeaderSize
\r
187 UINT32 NextHeaderCRC
\r
191 ...........................
\r
196 BYTE NID::kArchiveProperties (0x02)
\r
202 UINT64 PropertySize;
\r
203 BYTE PropertyData[PropertySize];
\r
207 Digests (NumStreams)
\r
208 ~~~~~~~~~~~~~~~~~~~~~
\r
210 if (AllAreDefined == 0)
\r
215 UINT32 CRCs[NumDefined]
\r
220 BYTE NID::kPackInfo (0x06)
\r
222 UINT64 NumPackStreams
\r
225 BYTE NID::kSize (0x09)
\r
226 UINT64 PackSizes[NumPackStreams]
\r
230 BYTE NID::kCRC (0x0A)
\r
231 PackStreamDigests[NumPackStreams]
\r
245 4: Is Complex Coder
\r
246 5: There Are Attributes
\r
248 7: There are more alternative methods. (Not used anymore, must be 0).
\r
250 BYTE CodecId[CodecIdSize]
\r
251 if (Is Complex Coder)
\r
253 UINT64 NumInStreams;
\r
254 UINT64 NumOutStreams;
\r
256 if (There Are Attributes)
\r
258 UINT64 PropertiesSize
\r
259 BYTE Properties[PropertiesSize]
\r
263 NumBindPairs = NumOutStreamsTotal - 1;
\r
271 NumPackedStreams = NumInStreamsTotal - NumBindPairs;
\r
272 if (NumPackedStreams > 1)
\r
273 for(NumPackedStreams)
\r
284 BYTE NID::kUnPackInfo (0x07)
\r
287 BYTE NID::kFolder (0x0B)
\r
293 Folders[NumFolders]
\r
295 UINT64 DataStreamIndex
\r
299 BYTE ID::kCodersUnPackSize (0x0C)
\r
301 for(Folder.NumOutStreams)
\r
306 BYTE NID::kCRC (0x0A)
\r
307 UnPackDigests[NumFolders]
\r
318 BYTE NID::kSubStreamsInfo; (0x08)
\r
321 BYTE NID::kNumUnPackStream; (0x0D)
\r
322 UINT64 NumUnPackStreamsInFolders[NumFolders];
\r
327 BYTE NID::kSize (0x09)
\r
328 UINT64 UnPackSizes[]
\r
333 BYTE NID::kCRC (0x0A)
\r
334 Digests[Number of streams with unknown CRC]
\r
363 BYTE NID::kFilesInfo; (0x05)
\r
374 switch(PropertyType)
\r
376 kEmptyStream: (0x0E)
\r
388 case kCTime: (0x12)
\r
389 case kATime: (0x13)
\r
390 case kMTime: (0x14)
\r
392 if (AllAreDefined == 0)
\r
401 for(Definded Items)
\r
412 wchar_t Names[NameSize];
\r
417 kAttributes: (0x15)
\r
419 if (AllAreDefined == 0)
\r
422 BIT AttributesAreDefined
\r
428 for(Definded Attributes)
\r
437 BYTE NID::kHeader (0x01)
\r
444 BYTE NID::kAdditionalStreamsInfo; (0x03)
\r
449 BYTE NID::kMainStreamsInfo; (0x04)
\r
463 BYTE NID::kEncodedHeader; (0x17)
\r
464 StreamsInfo for Encoded Header
\r