2012-02-09 2 views
3

리눅스 명령 행 도구 gzip 사용 gzip -l을 사용하여 압축 파일의 압축되지 않은 크기를 알 수 있습니다.zlib의 gzip 파일 액세스 기능을 사용하는 압축되지 않은 파일 크기

zlib 설명서 섹션 "gzip 파일 액세스 기능"에서 이와 같은 기능을 찾을 수 없습니다.

이 링크에서 나는 파일의 마지막 4 바이트를 읽는 것을 포함하는 해결책 http://www.abeel.be/content/determine-uncompressed-size-gzip-file을 발견했지만 lib 함수를 사용하기를 선호하기 때문에 지금 당장이를 피하고 있습니다.

+0

참고 : 비슷한 질문이 있지만 그 중 실제로 zlib 기능이있는 경우 답변이없는 것으로 알고 있습니다. –

답변

14

압축 해제되지 않은 gzip 파일의 압축되지 않은 크기를 얻거나 최소한 모든 것을 디코딩하는 확실한 방법은 없습니다. 세 가지 이유가 있습니다.

압축되지 않은 길이에 대한 유일한 정보는 gzip 파일의 끝에있는 4 바이트입니다 (리틀 엔디안 순서로 저장 됨). 필요에 따라서 길이는 모듈 길이 2 입니다. 압축되지 않은 길이가 4GB 이상인 경우 길이가 무엇인지 알 수 없습니다. 압축 된 길이가 2/1032 + 18 또는 약 4MB 미만인 경우 압축되지 않은 길이가 4GB 미만임을 확신 할 수 있습니다. (1032는 수축의 최대 압축률입니다.)

둘째로, gzip 파일은 실제로 여러 개의 gzip 스트림을 연결 한 것일 수 있습니다. 디코딩을 제외하고, 각 조각의 4 바이트 비 압축 길이를보기 위해 각 gzip 스트림이 끝나는 위치를 찾는 방법이 없습니다. (어쨌든 첫 번째 이유 때문에 잘못되었을 수 있습니다.) 셋째, gzip 파일은 gzip 스트림이 끝난 후 (일반적으로 0) 정크가있는 경우가 있습니다. 그런 다음 마지막 4 바이트는 길이가 아닙니다.

그래서 gzip -l은 실제로 작동하지 않습니다. 결과적으로 zlib에 해당 기능을 제공 할 필요가 없습니다.

pigz에는 실제 압축되지 않은 길이를 얻기 위해 사실 전체 입력을 디코딩 할 수있는 옵션이 있습니다 : pigz -lt, 정답을 보장합니다. pigz -l은 무엇을합니까? gzip -l은 잘못된 것일 수 있습니다.

+0

bzip2에도 동일한 제한 사항이 있는지 알고 있습니까? 압축 해제 진행률을 측정하기 위해 총 크기를 사용하기 때문에 압축 풀기는 옵션이 아닙니다. –

+2

압축되지 않은 데이터를 생성하는 대신 진행률 표시기에 압축 된 데이터를 소비하면됩니다. 처음 주문하는 경우 비례하므로 동일한 % 표시가 나타납니다. –

+1

"압축 해제 하시겠습니까?"또는 "적어도 해독"한다는 것은 무엇을 의미합니까? "압축 해제"와 "디코딩"의 차이점은 무엇입니까? – allyourcode

관련 문제