Чтение двоичных данных (из файла) в структуру

Я читаю двоичные данные из файла , а именно из zip-файла. (Чтобы узнать больше о структуре формата zip, см. http://en.wikipedia.org/wiki/ZIP_%28file_format%29 )

Я создал структуру, в которой хранятся данные:

typedef struct {
                                            /*Start Size            Description                                 */
    int signatute;                          /*   0  4   Local file header signature = 0x04034b50                */
    short int version;                      /*   4  2   Version needed to extract (minimum)                     */
    short int bit_flag;                     /*   6  2   General purpose bit flag                                */
    short int compression_method;           /*   8  2   Compression method                                      */
    short int time;                         /*  10  2   File last modification time                             */
    short int date;                         /*  12  2   File last modification date                             */
    int crc;                                /*  14  4   CRC-32                                                  */
    int compressed_size;                    /*  18  4   Compressed size                                         */
    int uncompressed_size;                  /*  22  4   Uncompressed size                                       */
    short int name_length;                  /*  26  2   File name length (n)                                    */
    short int extra_field_length;           /*  28  2   Extra field length (m)                                  */
    char *name;                             /*  30  n   File name                                               */
    char *extra_field;                      /*30+n  m   Extra field                                             */

} ZIP_local_file_header;

Размер, возвращаемый sizeof (ZIP_local_file_header) , равен 40, но если сумма каждого поля вычисляется с помощью оператора sizeof , общий размер будет 38.

Если у нас есть следующий struct:

typedef struct {
    short int x;
    int y;
} FOO;

sizeof (FOO) возвращает 8, потому что в памяти каждый раз выделяется 4 байта. Итак, для выделения x зарезервировано 4 байта (но реальный размер составляет 2 байта). Если нам понадобится еще один short int , он заполнит оставшиеся 2 байта предыдущего выделения. Но поскольку у нас есть int , он будет выделен плюс 4 байта, а пустые 2 байта будут потрачены впустую.

Чтобы прочитать данные из файла, мы можем использовать функцию fread :

ZIP_local_file_header p;
fread(&p,sizeof(ZIP_local_file_header),1,file);

Но поскольку в середине есть пустые байты, он не читается правильно.

Что я могу сделать, чтобы последовательно и эффективно хранить данные с ZIP_local_file_header без потери байтов?

12
задан rigon 21 October 2010 в 14:45
поделиться