/* * Generic (MS-DOS style) time stamp format (localtime): * * 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 * |<---- year-1980 --->|<- month ->|<--- day ---->| * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * |<--- hour --->|<---- minute --->|<- second/2 ->| * */ /* * extended header * * size field name * -------------------------------- * base header: : * 2 or 4 next-header size [*1] * -------------------------------------- * ext header: 1 ext-type ^ * ? contents | [*1] next-header size * 2 or 4 next-header size v * -------------------------------------- * * on level 1, 2 header: * size field is 2 bytes * on level 3 header: * size field is 4 bytes */ /* * level 0 header * * * offset size field name * ---------------------------------- * 0 1 header size [*1] * 1 1 header sum * --------------------------------------- * 2 5 method ID ^ * 7 4 packed size [*2] | * 11 4 original size | * 15 2 time | * 17 2 date | * 19 1 attribute | [*1] header size (X+Y+22) * 20 1 level (0x00 fixed) | * 21 1 name length | * 22 X pathname | * X +22 2 file crc (CRC-16) | * X +24 Y ext-header(old style) v * ------------------------------------------------- * X+Y+24 data ^ * : | [*2] packed size * : v * ------------------------------------------------- * * ext-header(old style) * 0 1 ext-type ('U') * 1 1 minor version * 2 4 UNIX time * 6 2 mode * 8 2 uid * 10 2 gid * * attribute (MS-DOS) * bit1 read only * bit2 hidden * bit3 system * bit4 volume label * bit5 directory * bit6 archive bit (need to backup) * */ /* * level 1 header * * * offset size field name * ----------------------------------- * 0 1 header size [*1] * 1 1 header sum * ------------------------------------- * 2 5 method ID ^ * 7 4 skip size [*2] | * 11 4 original size | * 15 2 time | * 17 2 date | * 19 1 attribute (0x20 fixed) | [*1] header size (X+Y+25) * 20 1 level (0x01 fixed) | * 21 1 name length | * 22 X filename | * X+ 22 2 file crc (CRC-16) | * X+ 24 1 OS ID | * X +25 Y ??? | * X+Y+25 2 next-header size v * ------------------------------------------------- * X+Y+27 Z ext-header ^ * : | * ----------------------------------- | [*2] skip size * X+Y+Z+27 data | * : v * ------------------------------------------------- * */ /* * level 2 header * * * offset size field name * -------------------------------------------------- * 0 2 total header size [*1] ^ * ----------------------- | * 2 5 method ID | * 7 4 packed size [*2] | * 11 4 original size | * 15 4 time | * 19 1 RESERVED (0x20 fixed) | [*1] total header size * 20 1 level (0x02 fixed) | (X+26+(1)) * 21 2 file crc (CRC-16) | * 23 1 OS ID | * 24 2 next-header size | * ----------------------------------- | * 26 X ext-header | * : | * ----------------------------------- | * X +26 (1) padding v * ------------------------------------------------- * X +26+(1) data ^ * : | [*2] packed size * : v * ------------------------------------------------- * */ /* * level 3 header * * * offset size field name * -------------------------------------------------- * 0 2 size field length (4 fixed) ^ * 2 5 method ID | * 7 4 packed size [*2] | * 11 4 original size | * 15 4 time | * 19 1 RESERVED (0x20 fixed) | [*1] total header size * 20 1 level (0x03 fixed) | (X+32) * 21 2 file crc (CRC-16) | * 23 1 OS ID | * 24 4 total header size [*1] | * 28 4 next-header size | * ----------------------------------- | * 32 X ext-header | * : v * ------------------------------------------------- * X +32 data ^ * : | [*2] packed size * : v * ------------------------------------------------- * */