2012-10-31 3 views
5

이렇게하는 방법이 있다고 생각하지만 잘 모르겠습니다. 기본적으로 압축 된 데이터의 압축을 풀려고 할 때 crc 오류가 발생한 압축 프로그램을 작성했습니다. 일반적으로 이것은 압축 해제 기가 내 데이터를 실제로 올바른 형식으로 인식하고 압축을 풀 었음을 의미하지만 CRC로 표시된 예상 길이와 결과를 비교할 때 동일하지 않습니다.CRC 오류에도 불구하고 gzip을 압축 해제합니다.

그러나 비교를 위해 실제로 출력을보고 연결 문제인지 확인하고 싶습니다 (압축 해제 된 출력이 횡설수조가 아닌 잘못된 순서 인 경우 상대적으로 분명해야 함).

답변

0

알고있는 한 CRC 검사는 GZIP 래퍼의 일부이며 DEFLATE 형식의 실제 압축 데이터의 일부는 아닙니다.

그래서 압축 된 데이터 스트림 인 문자 그대로 GZIP 헤더와 CRC를 무시하고 Inflater를 통해 전달할 수 있어야합니다.

즉, GZIP File format specification에서 "압축 된 블록"이라고하는 바이트에 해당하는 바이트 만 가져 와서 Java Inflater 객체를 사용하여 압축을 풀어야합니다. 그레그가 제안한대로 (비록 그의 옵션이 원칙적으로 작동 할지라도) GZIP 코드를 다시 컴파일하는 것보다는 약간의 작업이 가능할 것입니다.

8

"unzip"이라고했지만 질문에 "gzip"이라고 표시되어 있습니다. 무엇 이니? 그것들은 두 가지 다른 형식으로 작동하는 두 개의 서로 다른 프로그램입니다. gzip으로 가정합니다. 또한 길이는 "CRC에 의해 표시"되지 않습니다. gzip 예고편에는 CRC와 압축되지 않은 길이 (modulo 2)가 포함되어 있습니다. 두 가지가 다릅니다.

gzip 명령은 crc를 확인하기 전에 유효한 모든 수축 데이터를 압축 해제하고 기록합니다. 예를 들어, 내가 마지막에 .gz 파일 손상 단지 CRC (또는 길이)를 가지고 가고, 할, 그래서 만약 :

gzip -dc <corrupt.gz> result 

는 전체, 올바른 압축 데이터 스트림이 될 것입니다 발생합니다. gzip을 수정하고 다시 컴파일 할 필요가 없으며 자신 만의 지퍼를 쓸 필요가 없습니다. gzip은 crc에 대해 불평 할 것이지만 그럼에도 불구하고 모든 데이터가 기록됩니다.

관련 문제