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