2016-11-16 2 views
0

다소 큰 바이너리 파일 (717M)을 다루고 있습니다. 이 바이너리 파일에는 완전한 zip 파일 집합 (알 수없는 수!)이 들어 있습니다.큰 바이너리 파일에서 zip 파일 압축

내가 (explitly을 압축 할 필요) 그 zip 파일을 모두 추출하지 싶습니다

. 매직 번호 ('PK') 덕분에 각 청크의 오프셋 (시작점)을 찾을 수 있지만 각 청크의 길이를 계산하는 방법을 찾지 못합니다 (예 : 큰 이진 파일).

일부 문서 (http://forensicswiki.org/wiki/ZIP)를 읽으면 각 압축 파일의 compressed size이 포함되어 있으므로 압축 파일을 쉽게 파싱 할 수 있다는 인상을줍니다.

바퀴를 다시 발명하지 않고도 C 또는 Python으로 그렇게 할 수있는 방법이 있습니까?

답변

1

예를 들어 zip files in python을 처리 할 수있는 몇 가지 표준 방법이 있지만 내가 아는 한 (내가 전문이야 것을하지 않음) 먼저 든 실제 파일을 제공해야합니다. zip file format specification을 살펴 보시기 바랍니다.

당신은 당신이 매직 넘버에 대한 상대 위치에 따라 필요한 다른 정보를 찾을 수 있어야합니다. 만약 내가 CRC-32가 마술 번호라고 잘못 생각하지 않는다면, 4 바이트 앞으로 뛰어 오면 압축 된 크기가되고, 또 다른 8 바이트는 파일 이름을 가져와야합니다.

  • 로컬 파일 헤더 서명 4 바이트 (0x04034b50) 2 바이트를 추출하는 데 필요한
  • 버전
  • 범용 비트 플래그 2 바이트
  • 압축 방법 2 바이트
  • 마지막 개조 파일 시간 2 바이트
  • 지난 모드으로 파일 날짜 2 바이트
  • crc-32 4 바이트
  • 압축 크기가 4 바이트
  • 압축 크기가 4 바이트
  • 파일명 길이 2 바이트
  • 추가 필드 길이가 2 바이트

  • 파일명 (가변 크기)

  • 추가 필드 (가변 크기)

조금이라도 조금이라도 도움이 되길 바랍니다.

2

Zip 항목은 압축 된 크기를 로컬 헤더에 포함 할 수 없습니다. 압축 된 크기, 압축되지 않은 크기 및 CRC가 압축 된 데이터를 따르는 설명자를 갖는 플래그 비트가 있습니다.

끝 중앙 디렉토리 헤더를 검색 중앙 디렉토리를 찾을 것을 사용하고, 로컬 헤더 및 항목을 찾을 것을 사용하는 것이 더 안정적 일 것이다. 이렇게하려면 세부 사항에주의를 기울여야합니다. 즉, zip 형식을 설명하는 PKWare appnote을 매우주의 깊게 읽어야합니다. 추가 헤더와 필드가있는 Zip64 형식도 처리해야합니다. 즉

ZIP 엔트리가 저장 될 수는 압축 파일의 해당 위치에 그대로 복사하고, 그 자체로 항목 zip 파일 될 것이 가능하다.따라서 가장 외곽에있는 zip 파일 만 추출하여 내장 된 zip 파일의 경우를 처리해야합니다.