#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
typedef struct zip_header {
char sig[4];
uint16_t version;
uint16_t flags;
uint16_t compression;
uint16_t mod_time;
uint16_t mod_date;
uint32_t crc32;
uint32_t compressed_size;
uint32_t uncompressed_size;
uint16_t filename_len;
uint16_t extra_len;
} __attribute__((packed)) zip_header;
int main (void) {
zip_header header;
FILE *zip = fopen("shoe.zip", "r");
fread(&header, 1, sizeof(header), zip);
char *filename = malloc(header.filename_len);
fread(filename, header.filename_len, 1, zip);
char *extra = malloc(header.extra_len);
fread(extra, header.extra_len, 1, zip);
fclose(zip);
printf("version %d\n", header.version);
printf("flags 0x%x\n", header.flags);
printf("compression 0x%x\n", header.compression);
printf("mod time 0x%x\n", header.mod_time);
printf("mod date 0x%x\n", header.mod_date);
printf("crc32 0x%x\n", header.crc32);
printf("compressed size %u\n", header.compressed_size);
printf("uncompressed size %u\n", header.uncompressed_size);
printf("filename len %u\n", header.filename_len);
printf("extra len %u\n", header.extra_len);
printf("filename %s\n", filename);
free(filename);
printf("extra %s\n", extra);
free(extra);
printf("compressed data should start at byte %d\n",
sizeof(header) + header.filename_len + header.extra_len);
}