.ZIP 파일이란?
.zip 확장자를 가진 파일은 하나 이상의 파일 또는 디렉토리를 보유할 수 있는 아카이브입니다. 아카이브는 ZIP 파일 크기를 줄이기 위해 포함된 파일에 압축을 적용할 수 있습니다. ZIP 파일 형식은 1989년 2월 Phil Katz에 의해 파일 및 폴더 보관을 위해 공개되었습니다. 형식은 PKWARE, Inc.에서 만든 PKZIP 유틸리티의 일부로 만들어졌습니다. 사용 가능한 사양, Microsoft(Windows 7 이후), Apple(Mac OS X) 및 기타 여러 회사를 포함하여 많은 회사에서 ZIP 파일 형식을 소프트웨어 유틸리티의 일부로 만들었습니다.
ZIP 파일 형식의 간략한 역사
ZIP 파일 형식의 역사는 SEA(System Enhancement Associates)가 PKWARE의 상표 및 제품 외관 및 사용자 인터페이스에 대한 저작권에 대한 허가 없이 ARC 유틸리티를 사용한 것에 대해 소송을 제기한 사건으로 거슬러 올라갑니다. 이에 앞서 Phil Katz는 SEA의 소스 코드를 다시 작성하고 ARC 추출기인 PKXARC와 파일 압축기인 PKARC를 MS-DOS 기반 시스템용 프리웨어로 출시했습니다. 소송에서 패하면서 PKWARE는 더 이상 ARC와 관련된 모든 것을 사용할 수 없게 되었습니다. 여기에서 PKWARE, Inc.에서 PKZIP 유틸리티의 일부로 만든 ZIP이라는 새 파일 압축이 생성되었습니다.
Katz는 압축 및 추출 유틸리티(예: PKZIP)에 대한 소유권을 유지하면서 ZIP 파일 형식 사양을 공개 도메인으로 공개했습니다. ZIP 압축 시스템은 파일을 압축하는 32비트 순환 중복 검사(CRC) 알고리즘을 통해 폴더에 파일을 보관할 수 있었습니다. 크기. ARC와 달리 .ZIP 폴더에는 압축 파일을 렌더링하는 데 필요한 정보를 담고 있는 암호 해독가의 코드북 역할을 하는 디렉터리 파일이 포함되어 있습니다.
ZIP에서 지원되는 압축 방법
.ZIP 파일 형식 사양에 따라 다음 압축 방법이 지원됩니다.
- 저장 - 압축 없음을 의미합니다.
- 수축
- 감소(레벨 1에서 레벨 4까지의 압축 계수를 의미)
- 내파
- 수축
- 디플랫64
- BZIP2
- LZMA(EFS)
- 웨이브팩
- PPMd 버전 I, Rev 1
DEFLATE는 일반적으로 사용되는 압축 방법으로 LZ77과 Huffman 코딩의 조합을 사용하는 무손실 날짜 압축 알고리즘이며 RFC 1951에 자세히 설명되어 있습니다.
ZIP 파일 형식 사양
ZIP 파일에는 다른 압축 기술을 사용하여 여러 파일을 저장할 수 있는 기능이 있으며 동시에 압축 없이 파일을 저장할 수 있습니다. 각 파일은 개별적으로 저장/압축되어 전체 아카이브에 압축 또는 압축 해제를 적용하지 않고 파일을 추출하거나 새 파일을 추가하는 데 도움이 됩니다.
전체 ZIP 파일 형식
각 Zip 파일은 다음과 같은 방식으로 구성됩니다.
ZIP 파일 형식 |
---|
로컬 파일 헤더 1 |
파일 데이터 1 |
데이터 디스크립터 1 |
로컬 파일 헤더 2 |
파일 데이터 2 |
데이터 디스크립터 2 |
…. |
…. |
로컬 파일 헤더 N |
파일 데이터 N |
데이터 디스크립터 N |
아카이브 복호화 헤더 |
추가 데이터 기록 보관 |
중앙 디렉토리 |
ZIP 파일 형식은 보관 목적으로 32비트 CRC 알고리즘을 사용합니다. 압축된 파일을 렌더링하기 위해 ZIP 아카이브의 끝에는 포함된 파일의 항목과 아카이브 파일의 위치를 유지하는 디렉토리가 있습니다. 따라서 압축된 파일을 렌더링하는 데 필요한 정보를 캡슐화하는 인코딩 역할을 합니다. ZIP 리더는 전체 ZIP 아카이브를 읽지 않고 디렉토리를 사용하여 파일 목록을 로드합니다. 이 형식은 디렉토리 구조의 이중 복사본을 유지하여 데이터 손실에 대한 보호를 강화합니다.
ZIP 아카이브의 각 파일은 각 항목이 로컬 파일 헤더와 압축된 파일 데이터로 구성되는 개별 항목으로 표시됩니다. 아카이브 끝에 있는 디렉토리는 이러한 모든 파일 항목에 대한 참조를 보유합니다. ZIP 파일 판독기는 로컬 파일 헤더를 읽는 것을 피해야 하며 모든 종류의 파일 목록은 디렉토리에서 읽어야 합니다. 아카이브의 끝에 파일을 추가할 수도 있으므로 이 디렉토리는 아카이브의 유효한 파일 항목에 대한 유일한 소스입니다. 그렇기 때문에 독자가 처음부터 ZIP 아카이브의 로컬 헤더를 읽으면 유효하지 않은(삭제된) 항목과 아카이브에서 삭제되는 디렉토리의 일부가 아닌 항목을 읽을 수 있습니다.
중앙 디렉토리의 파일 항목 순서는 아카이브의 파일 항목 순서와 일치할 필요가 없습니다.
ZIP 파일 항목
ZIP 파일의 항목은 각 항목이 다음으로 구성된 순서대로 정렬됩니다.
- 로컬 파일 헤더
- 선택적 추가 데이터 필드
- 사용자 데이터(선택적으로 압축/선택적으로 암호화)
각 항목의 로컬 파일 헤더는 주석, 파일 크기 및 파일 이름과 같은 파일에 대한 정보를 나타냅니다. 추가 데이터 필드(선택 사항)는 ZIP 형식의 확장성 옵션에 대한 정보를 수용할 수 있습니다.
로컬 파일 헤더
로컬 파일 헤더에는 멀티바이트 값으로 구성된 특정 필드 구조가 있습니다. 모든 값은 필드 길이가 길이를 바이트 단위로 계산하는 리틀 엔디안 바이트 순서로 저장됩니다. ZIP 파일의 모든 구조는 각 파일 항목에 대해 4바이트 서명을 사용합니다. 중앙 디렉터리 서명의 끝은 0x06054b50이며 고유한 서명을 사용하여 구분할 수 있습니다. Local File Header에 저장되는 정보의 순서는 다음과 같다.
오프셋 | 바이트 | 설명 |
---|---|---|
0 | 4 | 로컬 파일 헤더 서명 # 0x04034b50(리틀 엔디안 숫자로 읽음) |
4 | 2 | 추출에 필요한 버전(최소) |
6 | 2 | 범용 비트 플래그 |
8 | 2 | 압축 방식 |
10 | 2 | 파일 마지막 수정 시간 |
12 | 2 | 파일 마지막 수정 날짜 |
14 | 4 | CRC-32 |
18 | 4 | 압축 크기 |
22 | 4 | 압축되지 않은 크기 |
26 | 2 | 파일 이름 길이(n) |
28 | 2 | 추가 필드 길이(m) |
30 | n | 파일 이름 |
30+n | m | 추가 필드 |
중앙 디렉토리 파일 헤더
오프셋 | 바이트 | 설명 |
---|---|---|
0 | 4 | 중앙 디렉토리 파일 헤더 서명 # 0x02014b50 |
4 | 2 | 버전 |
6 | 2 | 추출에 필요한 버전(최소) |
8 | 2 | 범용 비트 플래그 |
10 | 2 | 압축 방식 |
12 | 2 | 파일 마지막 수정 시간 |
14 | 2 | 파일 마지막 수정 날짜 |
16 | 4 | CRC-32 |
20 | 4 | 압축 크기 |
24 | 4 | 압축되지 않은 크기 |
28 | 2 | 파일 이름 길이(n) |
30 | 2 | 추가 필드 길이(m) |
32 | 2 | 파일 주석 길이(k) |
34 | 2 | 파일이 시작되는 디스크 번호 |
36 | 2 | 내부 파일 속성 |
38 | 4 | 외부 파일 속성 |
42 | 4 | 로컬 파일 헤더의 상대 오프셋. 이것은 파일이 발생한 첫 번째 디스크의 시작과 로컬 파일 헤더의 시작 사이의 바이트 수입니다. 이렇게 하면 중앙 디렉토리를 읽는 소프트웨어가 ZIP 파일 내에서 파일의 위치를 찾을 수 있습니다. |
46 | n | 파일 이름 |
46+n | m | 추가 필드 |
46+n+m | k | 파일 주석 |
중앙 디렉토리 레코드의 끝
오프셋 | 바이트 | 설명 |
---|---|---|
0 | 4 | 중앙 디렉토리 서명 끝 # 0x06054b50 |
4 | 2 | 이 디스크의 번호 |
6 | 2 | 중앙 디렉토리가 시작되는 디스크 |
8 | 2 | 이 디스크의 중앙 디렉토리 레코드 수 |
10 | 2 | 중앙 디렉토리 레코드의 총 수 |
12 | 4 | 중앙 디렉토리 크기(바이트) |
16 | 4 | 아카이브 시작을 기준으로 중앙 디렉토리 시작 오프셋 |
20 | 2 | 댓글 길이(n) |
22 | n | 댓글 |