7zFormat | ||
SignatureHeader | Signature | BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; |
ArchiveVersion | BYTE Major; // now = 0 BYTE Minor; // now = 4 | |
StartHeaderCRC | UINT32 | |
StartHeader | REAL_UINT64 NextHeaderOffset REAL_UINT64 NextHeaderSize UINT32 NextHeaderCRC | |
[PackedStreams] | ||
PackedStreamsForHeaders | ||
Headers Block | PackedHeader* | BYTE NID::kHeader (0x01) |
ArchiveProperties | ||
BYTE NID::kAdditionalStreamsInfo; (0x03) StreamsInfo | ||
BYTE NID::kMainStreamsInfo; (0x04) StreamsInfo | ||
FilesInfo | ||
BYTE NID::kEnd | ||
HeaderInfo | BYTE NID::kEncodedHeader; (0x17) StreamsInfo for Encoded Header | |
StreamsInfo | PackInfo | BYTE NID::kPackInfo (0x06) UINT64 PackPos UINT64 NumPackStreams |
BYTE NID::kSize (0x09) UINT64 PackSizes[NumPackStreams] | ||
BYTE NID::kCRC (0x0A) PackStreamDigests[NumPackStreams] | ||
BYTE NID::kEnd | ||
CodersInfo | BYTE NID::kUnPackInfo (0x07) | |
BYTE NID::kFolder (0x0B) UINT64 NumFolders BYTE External | ||
switch(External) { case 0: Folders[NumFolders] case 1: UINT64 DataStreamIndex } | ||
BYTE ID::kCodersUnPackSize (0x0C) for(Folders) for(Folder.NumOutStreams) UINT64 UnPackSize; | ||
BYTE NID::kCRC (0x0A) UnPackDigests[NumFolders] | ||
BYTE NID::kEnd | ||
SubStreams Info | BYTE NID::kSubStreamsInfo; (0x08) | |
BYTE NID::kNumUnPackStream; (0x0D) UINT64 NumUnPackStreamsInFolders[NumFolders]; | ||
BYTE NID::kSize (0x09) UINT64 UnPackSizes[] | ||
BYTE NID::kCRC (0x0A) Digests[Number of streams with unknown CRC] | ||
BYTE NID::kEnd | ||
Folder | UINT64 NumCoders; | |
for (NumCoders) { BYTE { 0:3 CodecIdSize 4: Is Complex Coder 5: There Are Attributes 6: Reserved 7: 0 } BYTE CodecId[CodecIdSize] if (Is Complex Coder) { UINT64 NumInStreams; UINT64 NumOutStreams; } if (There Are Attributes) { UINT64 PropertiesSize BYTE Properties[PropertiesSize] } } | ||
NumBindPairs = NumOutStreamsTotal – 1; | ||
for (NumBindPairs) { UINT64 InIndex; UINT64 OutIndex; } | ||
NumPackedStreams = NumInStreamsTotal – NumBindPairs; | ||
if (NumPackedStreams > 1) for(NumPackedStreams) { UINT64 Index; }; | ||
FilesInfo | BYTE NID::kFilesInfo; (0x05) UINT64 NumFiles | |
for (;;){ BYTE PropertyType; if (aType == 0) break; UINT64 Size; switch(PropertyType) { kEmptyStream: (0x0E) for(NumFiles) BIT IsEmptyStream kEmptyFile: (0x0F) for(EmptyStreams) BIT IsEmptyFile kAnti: (0x10) for(EmptyStreams) BIT IsAntiFile case kCTime: (0x12) case kATime: (0x13) case kMTime: (0x14) BYTE AllAreDefined if (AllAreDefined == 0) { for(NumFiles) BIT TimeDefined } BYTE External; if(External != 0) UINT64 DataIndex [] for(Definded Items) REAL_UINT64 Time []
kNames: (0x11) BYTE External; if(External != 0) UINT64 DataIndex [] for(Files) { wchar_t Names[NameSize]; wchar_t 0; } []
kAttributes: (0x15) BYTE AllAreDefined if (AllAreDefined == 0) { for(NumFiles) BIT AttributesAreDefined } BYTE External; if(External != 0) UINT64 DataIndex [] for(Definded Attributes) UINT32 Attributes [] } |