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>