我正在從文件讀取二進制數據,特別是從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