ZIP파일 시그니처 비트 관련 질문 입니다.
글쓴이: esaram5 / 작성시간: 월, 2021/12/20 - 8:54오후
C언어로 zip파일을 분석하는 프로그램을 만들고 있습니다.
다름이 아니라 파일의 내부 hex값에서 End of central directory record의 위치를 먼저 알아내려는 작업을 하려 합니다.
그런데 시그니처 비트인 0x06054b50가 파일안에 여러 번 존재해서 오류가 발생합니다.
마지막에 발견한 0x06054b50을 시그니처로 사용하기엔 .ZIP file comment (variable size) 내부에도 0x06054b50가 존재할 가능성이 있어 코드를 짜는데 어려움이 있습니다.
혹시 시그니처 비트를 효과적으로 탐색할 수 있는 방법이 있을까요?
현재는
int find_end_C_D(FILE file) { ulong signature=0; int result; while ((result = feof(&file)) == 0) { fread(&signature, sizeof(signature), 1, &file); fseek(&file, -3, SEEK_CUR); if (signature == 0x06054b50) { printf("%08x\n", signature); continue; } } }
이 코드에서
이렇게 한칸 씩 비교해가고 있습니다만 100MB파일을 처리하는데 시간이 너무 오래 걸립니다. 이 처리를 효율적으로 할 방법이 있을까요?
제 생각에는 한번에 여러 줄을 메모리에 읽어오고 시그니처 코드 뒤로 파일 포인터를 이동하여 구조체로 읽어오는 방법을 생각하고 있습니다.
최종적으로 분석해야 하는 파일은 6GB정도의 파일입니다.
Forums:
주로 느려지는 이유는 fread()로 너무 적은 파일
주로 느려지는 이유는 fread()로 너무 적은 파일 사이즈를 읽어오기 때문입니다. 머신은 한번에 약 수십 Mbytes를 읽어올 수 있는데 반해 4 bytes 단위로 읽어오기 때문입니다.
fread()로 한 4 X 1000 X 1000 = 4 Mbytes 씩 읽어서 처리해 보세요.
그럼에도 불구하고 기대보다 느리다면 멀티 쓰레드로 한 쓰레드는 파일에서 읽고, 다른 쓰레드(들)에서는 비교하고 그런 식으로 할 수도 있겠네요. 6GB를 몇분(초) 내에 처리해야 하는지에 따라 적당한 방법을 찾아야 합니다.
댓글 달기