Annotation of elwix/tools/oldlzma/7zFormat.txt, revision 1.1

1.1     ! misho       1: 7z Format description (2.30 Beta 25)
        !             2: -----------------------------------
        !             3: 
        !             4: This file contain descrition of 7z archive format. 
        !             5: 7z archive can contain files compressed with any method.
        !             6: See "Methods.txt" for description for defined compressing methods.
        !             7: 
        !             8: 
        !             9: Format structure Overview
        !            10: -------------------------
        !            11: 
        !            12: Some fields can be optional.
        !            13: 
        !            14: Archive structure
        !            15: ~~~~~~~~~~~~~~~~~  
        !            16: SignatureHeader
        !            17: [PackedStreams]
        !            18: [PackedStreamsForHeaders]
        !            19: [
        !            20:   Header 
        !            21:   or 
        !            22:   {
        !            23:     Packed Header
        !            24:     HeaderInfo
        !            25:   }
        !            26: ]
        !            27: 
        !            28: 
        !            29: 
        !            30: Header structure
        !            31: ~~~~~~~~~~~~~~~~  
        !            32: {
        !            33:   ArchiveProperties
        !            34:   AdditionalStreams
        !            35:   {
        !            36:     PackInfo
        !            37:     {
        !            38:       PackPos
        !            39:       NumPackStreams
        !            40:       Sizes[NumPackStreams]
        !            41:       CRCs[NumPackStreams]
        !            42:     }
        !            43:     CodersInfo
        !            44:     {
        !            45:       NumFolders
        !            46:       Folders[NumFolders]
        !            47:       {
        !            48:         NumCoders
        !            49:         CodersInfo[NumCoders]
        !            50:         {
        !            51:           ID
        !            52:           NumInStreams;
        !            53:           NumOutStreams;
        !            54:           PropertiesSize
        !            55:           Properties[PropertiesSize]
        !            56:         }
        !            57:         NumBindPairs
        !            58:         BindPairsInfo[NumBindPairs]
        !            59:         {
        !            60:           InIndex;
        !            61:           OutIndex;
        !            62:         }
        !            63:         PackedIndices
        !            64:       }
        !            65:       UnPackSize[Folders][Folders.NumOutstreams]
        !            66:       CRCs[NumFolders]
        !            67:     }
        !            68:     SubStreamsInfo
        !            69:     {
        !            70:       NumUnPackStreamsInFolders[NumFolders];
        !            71:       UnPackSizes[]
        !            72:       CRCs[]
        !            73:     }
        !            74:   }
        !            75:   MainStreamsInfo
        !            76:   {
        !            77:     (Same as in AdditionalStreams)
        !            78:   }
        !            79:   FilesInfo
        !            80:   {
        !            81:     NumFiles
        !            82:     Properties[]
        !            83:     {
        !            84:       ID
        !            85:       Size
        !            86:       Data
        !            87:     }
        !            88:   }
        !            89: }
        !            90: 
        !            91: HeaderInfo structure
        !            92: ~~~~~~~~~~~~~~~~~~~~
        !            93: {
        !            94:   (Same as in AdditionalStreams)
        !            95: }
        !            96: 
        !            97: 
        !            98: 
        !            99: Notes about Notation and encoding
        !           100: ---------------------------------
        !           101: 
        !           102: 7z uses little endian encoding.
        !           103: 
        !           104: 7z archive format has optional headers that are marked as
        !           105: []
        !           106: Header
        !           107: []
        !           108: 
        !           109: REAL_UINT64 means real UINT64.
        !           110: 
        !           111: UINT64 means real UINT64 encoded with the following scheme:
        !           112: 
        !           113:   Size of encoding sequence depends from first byte:
        !           114:   First_Byte  Extra_Bytes        Value
        !           115:   (binary)   
        !           116:   0xxxxxxx               : ( xxxxxxx           )
        !           117:   10xxxxxx    BYTE y[1]  : (  xxxxxx << (8 * 1)) + y
        !           118:   110xxxxx    BYTE y[2]  : (   xxxxx << (8 * 2)) + y
        !           119:   ...
        !           120:   1111110x    BYTE y[6]  : (       x << (8 * 6)) + y
        !           121:   11111110    BYTE y[7]  :                         y
        !           122:   11111111    BYTE y[8]  :                         y
        !           123: 
        !           124: 
        !           125: 
        !           126: Property IDs
        !           127: ------------
        !           128: 
        !           129: 0x00 = kEnd,
        !           130: 
        !           131: 0x01 = kHeader,
        !           132: 
        !           133: 0x02 = kArchiveProperties,
        !           134:     
        !           135: 0x03 = kAdditionalStreamsInfo,
        !           136: 0x04 = kMainStreamsInfo,
        !           137: 0x05 = kFilesInfo,
        !           138:     
        !           139: 0x06 = kPackInfo,
        !           140: 0x07 = kUnPackInfo,
        !           141: 0x08 = kSubStreamsInfo,
        !           142: 
        !           143: 0x09 = kSize,
        !           144: 0x0A = kCRC,
        !           145: 
        !           146: 0x0B = kFolder,
        !           147: 
        !           148: 0x0C = kCodersUnPackSize,
        !           149: 0x0D = kNumUnPackStream,
        !           150: 
        !           151: 0x0E = kEmptyStream,
        !           152: 0x0F = kEmptyFile,
        !           153: 0x10 = kAnti,
        !           154: 
        !           155: 0x11 = kName,
        !           156: 0x12 = kCreationTime,
        !           157: 0x13 = kLastAccessTime,
        !           158: 0x14 = kLastWriteTime,
        !           159: 0x15 = kWinAttributes,
        !           160: 0x16 = kComment,
        !           161: 
        !           162: 0x17 = kEncodedHeader,
        !           163: 
        !           164: 
        !           165: 7z format headers
        !           166: -----------------
        !           167: 
        !           168: SignatureHeader
        !           169: ~~~~~~~~~~~~~~~
        !           170:   BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C};
        !           171: 
        !           172:   ArchiveVersion
        !           173:   {
        !           174:     BYTE Major;   // now it = 0
        !           175:     BYTE Minor;   // now it = 1
        !           176:   };
        !           177: 
        !           178:   UINT32 StartHeaderCRC;
        !           179: 
        !           180:   StartHeader
        !           181:   {
        !           182:     REAL_UINT64 NextHeaderOffset
        !           183:     REAL_UINT64 NextHeaderSize
        !           184:     UINT32 NextHeaderCRC
        !           185:   }
        !           186: 
        !           187: 
        !           188: ...........................
        !           189: 
        !           190: 
        !           191: ArchiveProperties
        !           192: ~~~~~~~~~~~~~~~~~
        !           193: BYTE NID::kArchiveProperties (0x02)
        !           194: while(true)
        !           195: {
        !           196:   BYTE PropertyType;
        !           197:   if (aType == 0)
        !           198:     break;
        !           199:   UINT64 PropertySize;
        !           200:   BYTE PropertyData[PropertySize];
        !           201: }
        !           202: 
        !           203: 
        !           204: Digests (NumStreams)
        !           205: ~~~~~~~~~~~~~~~~~~~~~
        !           206:   BYTE AllAreDefined
        !           207:   if (AllAreDefined == 0)
        !           208:   {
        !           209:     for(NumStreams)
        !           210:       BIT Defined
        !           211:   }
        !           212:   UINT32 CRCs[NumDefined]
        !           213: 
        !           214: 
        !           215: PackInfo
        !           216: ~~~~~~~~~~~~
        !           217:   BYTE NID::kPackInfo  (0x06)
        !           218:   UINT64 PackPos
        !           219:   UINT64 NumPackStreams
        !           220: 
        !           221:   []
        !           222:   BYTE NID::kSize    (0x09)
        !           223:   UINT64 PackSizes[NumPackStreams]
        !           224:   []
        !           225: 
        !           226:   []
        !           227:   BYTE NID::kCRC      (0x0A)
        !           228:   PackStreamDigests[NumPackStreams]
        !           229:   []
        !           230: 
        !           231:   BYTE NID::kEnd
        !           232: 
        !           233: 
        !           234: Folder
        !           235: ~~~~~~
        !           236:   UINT64 NumCoders;
        !           237:   for (NumCoders)
        !           238:   {
        !           239:     BYTE 
        !           240:     {
        !           241:       0:3 DecompressionMethod.IDSize
        !           242:       4:
        !           243:         0 - IsSimple
        !           244:         1 - Is not simple
        !           245:       5:
        !           246:         0 - No Attributes
        !           247:         1 - There Are Attributes
        !           248:       7:
        !           249:         0 - Last Method in Alternative_Method_List
        !           250:         1 - There are more alternative methods
        !           251:     } 
        !           252:     BYTE DecompressionMethod.ID[DecompressionMethod.IDSize]
        !           253:     if (!IsSimple)
        !           254:     {
        !           255:       UINT64 NumInStreams;
        !           256:       UINT64 NumOutStreams;
        !           257:     }
        !           258:     if (DecompressionMethod[0] != 0)
        !           259:     {
        !           260:       UINT64 PropertiesSize
        !           261:       BYTE Properties[PropertiesSize]
        !           262:     }
        !           263:   }
        !           264:     
        !           265:   NumBindPairs = NumOutStreamsTotal - 1;
        !           266: 
        !           267:   for (NumBindPairs)
        !           268:   {
        !           269:     UINT64 InIndex;
        !           270:     UINT64 OutIndex;
        !           271:   }
        !           272: 
        !           273:   NumPackedStreams = NumInStreamsTotal - NumBindPairs;
        !           274:   if (NumPackedStreams > 1)
        !           275:     for(NumPackedStreams)
        !           276:     {
        !           277:       UINT64 Index;
        !           278:     };
        !           279: 
        !           280: 
        !           281: 
        !           282: 
        !           283: Coders Info
        !           284: ~~~~~~~~~~~
        !           285: 
        !           286:   BYTE NID::kUnPackInfo  (0x07)
        !           287: 
        !           288: 
        !           289:   BYTE NID::kFolder  (0x0B)
        !           290:   UINT64 NumFolders
        !           291:   BYTE External
        !           292:   switch(External)
        !           293:   {
        !           294:     case 0:
        !           295:       Folders[NumFolders]
        !           296:     case 1:
        !           297:       UINT64 DataStreamIndex
        !           298:   }
        !           299: 
        !           300: 
        !           301:   BYTE ID::kCodersUnPackSize  (0x0C)
        !           302:   for(Folders)
        !           303:     for(Folder.NumOutStreams)
        !           304:      UINT64 UnPackSize;
        !           305: 
        !           306: 
        !           307:   []
        !           308:   BYTE NID::kCRC   (0x0A)
        !           309:   UnPackDigests[NumFolders]
        !           310:   []
        !           311: 
        !           312:   
        !           313: 
        !           314:   BYTE NID::kEnd
        !           315: 
        !           316: 
        !           317: 
        !           318: SubStreams Info
        !           319: ~~~~~~~~~~~~~~
        !           320:   BYTE NID::kSubStreamsInfo; (0x08)
        !           321: 
        !           322:   []
        !           323:   BYTE NID::kNumUnPackStream; (0x0D)
        !           324:   UINT64 NumUnPackStreamsInFolders[NumFolders];
        !           325:   []
        !           326: 
        !           327: 
        !           328:   []
        !           329:   BYTE NID::kSize  (0x09)
        !           330:   UINT64 UnPackSizes[]
        !           331:   []
        !           332: 
        !           333: 
        !           334:   []
        !           335:   BYTE NID::kCRC  (0x0A)
        !           336:   Digests[Number of streams with unknown CRC]
        !           337:   []
        !           338: 
        !           339:   
        !           340:   BYTE NID::kEnd
        !           341: 
        !           342: 
        !           343: Streams Info
        !           344: ~~~~~~~~~~~~
        !           345: 
        !           346:   []
        !           347:   PackInfo
        !           348:   []
        !           349: 
        !           350: 
        !           351:   []
        !           352:   CodersInfo
        !           353:   []
        !           354: 
        !           355: 
        !           356:   []
        !           357:   SubStreamsInfo
        !           358:   []
        !           359: 
        !           360:   BYTE NID::kEnd
        !           361: 
        !           362: 
        !           363: FilesInfo
        !           364: ~~~~~~~~~
        !           365:   BYTE NID::kFilesInfo;  (0x05)
        !           366:   UINT64 NumFiles
        !           367: 
        !           368:   while(true)
        !           369:   {
        !           370:     BYTE PropertyType;
        !           371:     if (aType == 0)
        !           372:       break;
        !           373: 
        !           374:     UINT64 Size;
        !           375: 
        !           376:     switch(PropertyType)
        !           377:     {
        !           378:       kEmptyStream:   (0x0E)
        !           379:         for(NumFiles)
        !           380:           BIT IsEmptyStream
        !           381: 
        !           382:       kEmptyFile:     (0x0F)
        !           383:         for(EmptyStreams)
        !           384:           BIT IsEmptyFile
        !           385: 
        !           386:       kAnti:          (0x10)
        !           387:         for(EmptyStreams)
        !           388:           BIT IsAntiFile
        !           389:       
        !           390:       case kCreationTime:   (0x12)
        !           391:       case kLastAccessTime: (0x13)
        !           392:       case kLastWriteTime:  (0x14)
        !           393:         BYTE AllAreDefined
        !           394:         if (AllAreDefined == 0)
        !           395:         {
        !           396:           for(NumFiles)
        !           397:             BIT TimeDefined
        !           398:         }
        !           399:         BYTE External;
        !           400:         if(External != 0)
        !           401:           UINT64 DataIndex
        !           402:         []
        !           403:         for(Definded Items)
        !           404:           UINT32 Time
        !           405:         []
        !           406:       
        !           407:       kNames:     (0x11)
        !           408:         BYTE External;
        !           409:         if(External != 0)
        !           410:           UINT64 DataIndex
        !           411:         []
        !           412:         for(Files)
        !           413:         {
        !           414:           wchar_t Names[NameSize];
        !           415:           wchar_t 0;
        !           416:         }
        !           417:         []
        !           418: 
        !           419:       kAttributes:  (0x15)
        !           420:         BYTE AllAreDefined
        !           421:         if (AllAreDefined == 0)
        !           422:         {
        !           423:           for(NumFiles)
        !           424:             BIT AttributesAreDefined
        !           425:         }
        !           426:         BYTE External;
        !           427:         if(External != 0)
        !           428:           UINT64 DataIndex
        !           429:         []
        !           430:         for(Definded Attributes)
        !           431:           UINT32 Attributes
        !           432:         []
        !           433:     }
        !           434:   }
        !           435: 
        !           436: 
        !           437: Header
        !           438: ~~~~~~
        !           439:   BYTE NID::kHeader (0x01)
        !           440: 
        !           441:   []
        !           442:   ArchiveProperties
        !           443:   []
        !           444: 
        !           445:   []
        !           446:   BYTE NID::kAdditionalStreamsInfo; (0x03)
        !           447:   StreamsInfo
        !           448:   []
        !           449: 
        !           450:   []
        !           451:   BYTE NID::kMainStreamsInfo;    (0x04)
        !           452:   StreamsInfo
        !           453:   []
        !           454: 
        !           455:   []
        !           456:   FilesInfo
        !           457:   []
        !           458: 
        !           459:   BYTE NID::kEnd
        !           460: 
        !           461: 
        !           462: HeaderInfo
        !           463: ~~~~~~~~~~
        !           464:   []
        !           465:   BYTE NID::kEncodedHeader; (0x17)
        !           466:   StreamsInfo for Encoded Header
        !           467:   []
        !           468: 
        !           469: 
        !           470: ---
        !           471: End of document

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>