Index: third_party/lzma_sdk/7zFormat.txt |
=================================================================== |
--- third_party/lzma_sdk/7zFormat.txt (revision 0) |
+++ third_party/lzma_sdk/7zFormat.txt (revision 0) |
@@ -0,0 +1,471 @@ |
+7z Format description (2.30 Beta 25) |
+----------------------------------- |
+ |
+This file contains description of 7z archive format. |
+7z 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 |
+--------------------------------- |
+ |
+7z uses little endian encoding. |
+ |
+7z 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) |
+ 0xxxxxxx : ( xxxxxxx ) |
+ 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y |
+ 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y |
+ ... |
+ 1111110x BYTE y[6] : ( x << (8 * 6)) + y |
+ 11111110 BYTE y[7] : y |
+ 11111111 BYTE y[8] : y |
+ |
+ |
+ |
+Property IDs |
+------------ |
+ |
+0x00 = kEnd, |
+ |
+0x01 = kHeader, |
+ |
+0x02 = kArchiveProperties, |
+ |
+0x03 = kAdditionalStreamsInfo, |
+0x04 = kMainStreamsInfo, |
+0x05 = kFilesInfo, |
+ |
+0x06 = kPackInfo, |
+0x07 = kUnPackInfo, |
+0x08 = kSubStreamsInfo, |
+ |
+0x09 = kSize, |
+0x0A = kCRC, |
+ |
+0x0B = kFolder, |
+ |
+0x0C = kCodersUnPackSize, |
+0x0D = kNumUnPackStream, |
+ |
+0x0E = kEmptyStream, |
+0x0F = kEmptyFile, |
+0x10 = kAnti, |
+ |
+0x11 = kName, |
+0x12 = kCreationTime, |
+0x13 = kLastAccessTime, |
+0x14 = kLastWriteTime, |
+0x15 = kWinAttributes, |
+0x16 = kComment, |
+ |
+0x17 = kEncodedHeader, |
+ |
+ |
+7z format headers |
+----------------- |
+ |
+SignatureHeader |
+~~~~~~~~~~~~~~~ |
+ BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; |
+ |
+ ArchiveVersion |
+ { |
+ BYTE Major; // now = 0 |
+ BYTE Minor; // now = 2 |
+ }; |
+ |
+ UINT32 StartHeaderCRC; |
+ |
+ StartHeader |
+ { |
+ REAL_UINT64 NextHeaderOffset |
+ REAL_UINT64 NextHeaderSize |
+ UINT32 NextHeaderCRC |
+ } |
+ |
+ |
+........................... |
+ |
+ |
+ArchiveProperties |
+~~~~~~~~~~~~~~~~~ |
+BYTE NID::kArchiveProperties (0x02) |
+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 (0x06) |
+ UINT64 PackPos |
+ UINT64 NumPackStreams |
+ |
+ [] |
+ BYTE NID::kSize (0x09) |
+ UINT64 PackSizes[NumPackStreams] |
+ [] |
+ |
+ [] |
+ BYTE NID::kCRC (0x0A) |
+ PackStreamDigests[NumPackStreams] |
+ [] |
+ |
+ BYTE NID::kEnd |
+ |
+ |
+Folder |
+~~~~~~ |
+ UINT64 NumCoders; |
+ for (NumCoders) |
+ { |
+ BYTE |
+ { |
+ 0:3 DecompressionMethod.IDSize |
+ 4: |
+ 0 - IsSimple |
+ 1 - Is not simple |
+ 5: |
+ 0 - No Attributes |
+ 1 - There Are Attributes |
+ 7: |
+ 0 - Last Method in Alternative_Method_List |
+ 1 - There are more alternative methods |
+ } |
+ BYTE DecompressionMethod.ID[DecompressionMethod.IDSize] |
+ if (!IsSimple) |
+ { |
+ UINT64 NumInStreams; |
+ UINT64 NumOutStreams; |
+ } |
+ if (DecompressionMethod[0] != 0) |
+ { |
+ 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 (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 |
+ |
+ |
+Streams Info |
+~~~~~~~~~~~~ |
+ |
+ [] |
+ PackInfo |
+ [] |
+ |
+ |
+ [] |
+ CodersInfo |
+ [] |
+ |
+ |
+ [] |
+ SubStreamsInfo |
+ [] |
+ |
+ BYTE NID::kEnd |
+ |
+ |
+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 kCreationTime: (0x12) |
+ case kLastAccessTime: (0x13) |
+ case kLastWriteTime: (0x14) |
+ BYTE AllAreDefined |
+ if (AllAreDefined == 0) |
+ { |
+ for(NumFiles) |
+ BIT TimeDefined |
+ } |
+ BYTE External; |
+ if(External != 0) |
+ UINT64 DataIndex |
+ [] |
+ for(Definded Items) |
+ UINT32 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 |
+ [] |
+ } |
+ } |
+ |
+ |
+Header |
+~~~~~~ |
+ 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 |
+ [] |
+ |
+ |
+--- |
+End of document |
Property changes on: third_party\lzma_sdk\7zFormat.txt |
___________________________________________________________________ |
Added: svn:executable |
+ * |