/*
* @author Xcross87
* @date 10 Oct 2008
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "zip.h"
//====================================================================================
void read_lfh(ZIP_LOCAL_FILE_HEADER* lfh, FILE* fp)
{
if(fp != (FILE*) NULL) {
fseek(fp, 0, SEEK_SET);
fread(&lfh->signature, sizeof(WORD), 1, fp);
fread(&lfh->version, sizeof(SHORT), 1, fp);
fread(&lfh->bit_flag, sizeof(SHORT), 1, fp);
fread(&lfh->compression_method, sizeof(SHORT), 1, fp);
fread(&lfh->lmf_time, sizeof(SHORT), 1, fp);
fread(&lfh->lmf_date, sizeof(SHORT), 1, fp);
fread(&lfh->crc32, sizeof(WORD), 1, fp);
fread(&lfh->csize, sizeof(WORD), 1, fp);
fread(&lfh->ucsize, sizeof(WORD), 1, fp);
fread(&lfh->fn_length, sizeof(SHORT), 1, fp);
fread(&lfh->ex_length, sizeof(SHORT), 1, fp);
fread(&lfh->file_name, sizeof(char)*lfh->fn_length, 1, fp);
fread(&lfh->extra_field, sizeof(char)*lfh->ex_length, 1, fp);
}
}
//========================================================
char* get_fname(ZIP_LOCAL_FILE_HEADER* lfh, FILE* fp)
{
int fn_len = lfh->fn_length; // lấy độ dài tên file
// khởi tạo chuỗi: độ dài tên file + 1
char* fname = (char*) malloc( sizeof(char) * fn_len + sizeof(char));
fseek(fp, 30, SEEK_SET); // đặt con trỏ với OFFSET: 30
fread(fname, sizeof(char), fn_len, fp); // lấy tên file
*(fname + fn_len) = 0; // kết thúc chuỗi \0
return fname;
}
//========================================================
bool isZipFile(const char* file_name)
{
bool status = false;
FILE* fp;
char list[2];
fopen_s(&fp,file_name, "rb");
if (!fp)
printf("\nError open %s for reading!\n", file_name);
else
{
// offset 0x00 : magic byte: 0x50 0x4B (PK)
fread(list, sizeof(char), 2, fp);
//printf("%c %c", list[0], list[1]); // in ra P K
if ((strcmp(list, "PK")==0))
status = true;
}
fclose(fp);
return status;
}
//========================================================
void write_lfh(ZIP_LOCAL_FILE_HEADER* lfh)
{
printf("Signature = %x\n", lfh->signature);
printf("Version = %x\n", lfh->version);
printf("Bit_Flag = %d\n", lfh->bit_flag);
printf("Compression method = %d\n", lfh->compression_method);
printf("Time = %x\n", lfh->lmf_time);
printf("Date = %ld\n", lfh->lmf_date);
printf("CRC32 = %x\n", lfh->crc32);
printf("CSize = %ld\n", lfh->csize);
printf("UCSize = %ld\n", lfh->ucsize);
printf("Filename length = %ld\n", lfh->fn_length);
printf("Filename ex_length = %ld\n", lfh->ex_length);
printf("Filename = %s\n", lfh->file_name);
printf("Extra field = %s\n", lfh->extra_field);
}