我正在从文件读取二进制数据,特别是从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
浪费无字节?
http://stackoverflow.com/questions/3913119/dumping-memory-to-file/3913152#3913152 < - 可能的重复 – 2010-10-21 14:52:30
写得很好的问题。 – 2010-10-21 14:54:36