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

[]

}