我正在从文件中读取二进制数据,具体来说是从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。
如果我们有以下结构体:
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
?