Tôi đang đọc dữ liệu nhị phân từ tệp, cụ thể là từ tệp zip. (Để biết thêm về cấu trúc định dạng zip thấy http://en.wikipedia.org/wiki/ZIP_%28file_format%29)Đọc dữ liệu nhị phân (từ tệp) thành cấu trúc
tôi đã tạo ra một cấu trúc lưu trữ dữ liệu:
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;
Kích thước được trả về bởi sizeof(ZIP_local_file_header)
là 40, nhưng nếu tổng của từng lĩnh vực là tính toán với sizeof
điều hành tổng kích thước là 38.
Nếu chúng ta có cấu trúc tiếp theo:
typedef struct {
short int x;
int y;
} FOO;
sizeof(FOO)
trả về 8 vì bộ nhớ được cấp phát với 4 byte mỗi lần. Vì vậy, để phân bổ x
được dành riêng 4 byte (nhưng kích thước thực là 2 byte). Nếu chúng ta cần thêm short int
, nó sẽ lấp đầy 2 byte còn lại của phân bổ trước đó. Nhưng khi chúng tôi có một số int
, nó sẽ được phân bổ cộng 4 byte và 2 byte trống sẽ bị lãng phí.
Để đọc dữ liệu từ tập tin, chúng ta có thể sử dụng chức năng fread
:
ZIP_local_file_header p;
fread(&p,sizeof(ZIP_local_file_header),1,file);
Nhưng vì có đang byte rỗng ở giữa, nó không phải là đọc một cách chính xác.
Tôi có thể làm gì để lưu trữ dữ liệu tuần tự và hiệu quả với ZIP_local_file_header
lãng phí không có byte?
http://stackoverflow.com/questions/3913119/dumping-memory-to-file/3913152#3913152 <- có thể trùng lặp –
Câu hỏi được viết độc đáo. –