7 z Format description (4 .59 )
----------------------------
This file contains description of 7 z archive format.
7 z archive can contain files compressed with any method.
See "Methods.txt" for description for defined compressing methods.
Format structure Overview
-------------------------
Some fields can be optional.
Archive structure
~~~~~~~~~~~~~~~~~
SignatureHeader
[PackedStreams]
[PackedStreamsForHeaders]
[
Header
or
{
Packed Header
HeaderInfo
}
]
Header structure
~~~~~~~~~~~~~~~~
{
ArchiveProperties
AdditionalStreams
{
PackInfo
{
PackPos
NumPackStreams
Sizes[NumPackStreams]
CRCs[NumPackStreams]
}
CodersInfo
{
NumFolders
Folders[NumFolders]
{
NumCoders
CodersInfo[NumCoders]
{
ID
NumInStreams;
NumOutStreams;
PropertiesSize
Properties[PropertiesSize]
}
NumBindPairs
BindPairsInfo[NumBindPairs]
{
InIndex;
OutIndex;
}
PackedIndices
}
UnPackSize[Folders][Folders.NumOutstreams]
CRCs[NumFolders]
}
SubStreamsInfo
{
NumUnPackStreamsInFolders[NumFolders];
UnPackSizes[]
CRCs[]
}
}
MainStreamsInfo
{
(Same as in AdditionalStreams)
}
FilesInfo
{
NumFiles
Properties[]
{
ID
Size
Data
}
}
}
HeaderInfo structure
~~~~~~~~~~~~~~~~~~~~
{
(Same as in AdditionalStreams)
}
Notes about Notation and encoding
---------------------------------
7 z uses little endian encoding.
7 z archive format has optional headers that are marked as
[]
Header
[]
REAL_UINT64 means real UINT64.
UINT64 means real UINT64 encoded with the following scheme:
Size of encoding sequence depends from first byte:
First_Byte Extra_Bytes Value
(binary)
0 xxxxxxx : ( xxxxxxx )
10 xxxxxx BYTE y[1 ] : ( xxxxxx << (8 * 1 )) + y
110 xxxxx BYTE y[2 ] : ( xxxxx << (8 * 2 )) + y
...
1111110 x BYTE y[6 ] : ( x << (8 * 6 )) + y
11111110 BYTE y[7 ] : y
11111111 BYTE y[8 ] : y
Property IDs
------------
0 x00 = kEnd
0 x01 = kHeader
0 x02 = kArchiveProperties
0 x03 = kAdditionalStreamsInfo
0 x04 = kMainStreamsInfo
0 x05 = kFilesInfo
0 x06 = kPackInfo
0 x07 = kUnPackInfo
0 x08 = kSubStreamsInfo
0 x09 = kSize
0 x0A = kCRC
0 x0B = kFolder
0 x0C = kCodersUnPackSize
0 x0D = kNumUnPackStream
0 x0E = kEmptyStream
0 x0F = kEmptyFile
0 x10 = kAnti
0 x11 = kName
0 x12 = kCTime
0 x13 = kATime
0 x14 = kMTime
0 x15 = kWinAttributes
0 x16 = kComment
0 x17 = kEncodedHeader
0 x18 = kStartPos
0 x19 = kDummy
7 z format headers
-----------------
SignatureHeader
~~~~~~~~~~~~~~~
BYTE kSignature[6 ] = {'7 ', 'z', 0 xBC, 0 xAF, 0 x27, 0 x1C};
ArchiveVersion
{
BYTE Major; // now = 0
BYTE Minor; // now = 2
};
UINT32 StartHeaderCRC;
StartHeader
{
REAL_UINT64 NextHeaderOffset
REAL_UINT64 NextHeaderSize
UINT32 NextHeaderCRC
}
...........................
ArchiveProperties
~~~~~~~~~~~~~~~~~
BYTE NID::kArchiveProperties (0 x02)
for (;;)
{
BYTE PropertyType;
if (aType == 0 )
break;
UINT64 PropertySize;
BYTE PropertyData[PropertySize];
}
Digests (NumStreams)
~~~~~~~~~~~~~~~~~~~~~
BYTE AllAreDefined
if (AllAreDefined == 0 )
{
for(NumStreams)
BIT Defined
}
UINT32 CRCs[NumDefined]
PackInfo
~~~~~~~~~~~~
BYTE NID::kPackInfo (0 x06)
UINT64 PackPos
UINT64 NumPackStreams
[]
BYTE NID::kSize (0 x09)
UINT64 PackSizes[NumPackStreams]
[]
[]
BYTE NID::kCRC (0 x0A)
PackStreamDigests[NumPackStreams]
[]
BYTE NID::kEnd
Folder
~~~~~~
UINT64 NumCoders;
for (NumCoders)
{
BYTE
{
0 :3 CodecIdSize
4 : Is Complex Coder
5 : There Are Attributes
6 : Reserved
7 : There are more alternative methods. (Not used anymore, must be 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;
};
Coders Info
~~~~~~~~~~~
BYTE NID::kUnPackInfo (0 x07)
BYTE NID::kFolder (0 x0B)
UINT64 NumFolders
BYTE External
switch(External)
{
case 0 :
Folders[NumFolders]
case 1 :
UINT64 DataStreamIndex
}
BYTE ID::kCodersUnPackSize (0 x0C)
for(Folders)
for(Folder.NumOutStreams)
UINT64 UnPackSize;
[]
BYTE NID::kCRC (0 x0A)
UnPackDigests[NumFolders]
[]
BYTE NID::kEnd
SubStreams Info
~~~~~~~~~~~~~~
BYTE NID::kSubStreamsInfo; (0 x08)
[]
BYTE NID::kNumUnPackStream; (0 x0D)
UINT64 NumUnPackStreamsInFolders[NumFolders];
[]
[]
BYTE NID::kSize (0 x09)
UINT64 UnPackSizes[]
[]
[]
BYTE NID::kCRC (0 x0A)
Digests[Number of streams with unknown CRC]
[]
BYTE NID::kEnd
Streams Info
~~~~~~~~~~~~
[]
PackInfo
[]
[]
CodersInfo
[]
[]
SubStreamsInfo
[]
BYTE NID::kEnd
FilesInfo
~~~~~~~~~
BYTE NID::kFilesInfo; (0 x05)
UINT64 NumFiles
for (;;)
{
BYTE PropertyType;
if (aType == 0 )
break;
UINT64 Size;
switch(PropertyType)
{
kEmptyStream: (0 x0E)
for(NumFiles)
BIT IsEmptyStream
kEmptyFile: (0 x0F)
for(EmptyStreams)
BIT IsEmptyFile
kAnti: (0 x10)
for(EmptyStreams)
BIT IsAntiFile
case kCTime: (0 x12)
case kATime: (0 x13)
case kMTime: (0 x14)
BYTE AllAreDefined
if (AllAreDefined == 0 )
{
for(NumFiles)
BIT TimeDefined
}
BYTE External;
if(External != 0 )
UINT64 DataIndex
[]
for(Definded Items)
UINT64 Time
[]
kNames: (0 x11)
BYTE External;
if(External != 0 )
UINT64 DataIndex
[]
for(Files)
{
wchar_t Names[NameSize];
wchar_t 0 ;
}
[]
kAttributes: (0 x15)
BYTE AllAreDefined
if (AllAreDefined == 0 )
{
for(NumFiles)
BIT AttributesAreDefined
}
BYTE External;
if(External != 0 )
UINT64 DataIndex
[]
for(Definded Attributes)
UINT32 Attributes
[]
}
}
Header
~~~~~~
BYTE NID::kHeader (0 x01)
[]
ArchiveProperties
[]
[]
BYTE NID::kAdditionalStreamsInfo; (0 x03)
StreamsInfo
[]
[]
BYTE NID::kMainStreamsInfo; (0 x04)
StreamsInfo
[]
[]
FilesInfo
[]
BYTE NID::kEnd
HeaderInfo
~~~~~~~~~~
[]
BYTE NID::kEncodedHeader; (0 x17)
StreamsInfo for Encoded Header
[]
---
End of document
Messung V0.5 in Prozent C=96 H=87 G=91
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-05)
¤
*© Formatika GbR, Deutschland