2009-05-29 2 views
3

DeflaterOutputStream을 사용하여 독점적 아카이브 파일 형식의 일부로 데이터를 압축합니다. 그런 다음 jcraft zlib 코드를 사용하여 상대방의 데이터를 압축 해제합니다. 다른 쪽은 J2ME 응용 프로그램이므로 표준 Java 라이브러리가 아닌 제 3 자 우편 압축 해제 코드에 의존합니다.다른 zlib 압축 방법은 무엇이며 어떻게 Java Deflater에서 기본값을 강제 설정합니까?

내 문제는 일부 파일은 압축하고 압축을 풀 수 있지만 다른 파일은 압축 해제하지 않는 것입니다.

그렇지 않은 데이터의 경우 첫 번째 바이트의 압축 방법이 '5'인 것으로 보입니다.

필자가 zlib을 읽었을 때 기본값 인 '8'은 기본 압축 방법을 나타냅니다. 다른 모든 값은 압축 해 제기에서 받아 들일 수없는 것 같습니다.

내가 알고 싶은 것입니다 :

  • '5'는 무엇을 나타 냅니까?
  • 왜 DeflaterOutputStream은 다른 압축 방법을 사용합니까?
  • 어떻게 든 그 일을 중단 할 수 있습니까?
  • 기본 압축 방법 만 사용하는 압축 된 데이터를 생성하는 다른 방법이 있습니까?

답변

6

당신이보고있는 것을 정확하게 연마하는 데 도움이 될 수 있습니다.

전체 데이터가 나오기 전에 보통 ZLIB 헤더이 2 바이트입니다. 내가 아는 한, 의 첫 번째 바이트의 하위 4 비트는 항상 8이어야합니다. Deflater를 nowrap 모드로 초기화하면이 두 바이트를 전혀받지 못합니다 (다른 라이브러리에서는 가져 오지 않을 것으로 예상하지만).

그리고, 데이터의 각 블록을하기 전에 3 비트 블록 헤더 (비트 바이트없는 정수의 수로 정의 통지)가있다. 최종 블록 인 압축 된 블록 또는 압축되지 않은 비 최종 블록 인 8 바이트를 나타내는 바이트 5로 시작하는 블록을 가질 수 있습니다.

DeflaterOutputStream을 만들 때 Deflater 또는 선택자를 생성자에 전달할 수 있으며 해당 Defalter에는 설정할 수있는 몇 가지 옵션이 있습니다. 레벨은 본질적으로 데이터에서 반복되는 패턴을 찾을 때 압축이 사용하는 미리보기 양입니다. offchance에서이 값을 기본값이 아닌 값으로 설정하고 압축 해제 기가 처리 할 수 ​​있는지 여부에 차이가 있는지 확인해보십시오.

전략 설정 (setStrategy() 메소드 참조)은 특별한 상황에서 데프레이터에게 허프만 압축 만 적용하도록 지시 할 수 있습니다. 값의 빈도가 2의 음수 (즉, 허프만 코딩이 가장 잘 작동하는 분포)에 근접하도록 데이터를 이미 변형 한 경우에 유용 할 수 있습니다. 이 설정이 라이브러리가 데이터를 읽을 수 있는지 여부에 영향을 미치지는 않겠지 만, 중요도에 따라이 설정을 변경해보십시오.

도움이 필요한 경우 변환 된 데이터에 huffman 전용 압축을 사용하는 방법을 포함하여 configuring Deflater에 대해 약간 설명했습니다. 나는 당신이 선택하는 옵션이 무엇이든지, 당신의 도서관이 실제로 데이터를 읽을 수 있기를 기대합니다.압축 된 데이터가 정확한지 확실하면 (즉, ZLIB/Inflater에서 파일을 다시 읽을 수 있음) 다른 라이브러리를 사용하는 것이 좋습니다 ...!

아, 명백한 출혈이 분명하지만 나는 어쨌든 언급 할 것입니다. 데이터가 고정되어 있다면 물론 항아리에 붙일 수 있으며 효과적으로 "공기가 빠지도록"공기가 빠져 나갈 것입니다. 아이러니하게도, J2ME 장치는 zlib으로 압축 된 데이터를 반드시 디코딩 할 수 있어야합니다. 왜냐하면 이것이 본질적으로 항아리가있는 형식이기 때문입니다 ...

+0

Neil, 허프만 인코딩 및 주파수 등을 어떻게 알 수 있습니까? – Cheeso

+0

아하 .. 우연히 'nowrap'을 설정했습니다. 감사합니다. – izb

+0

다행입니다! Cheeso- 주파수에 관한 것은 특별한 지식이 아닙니다. 표준 정보 이론에서 벗어납니다. 임의의 주파수 분포를 취하면 이상적인 인코딩은 일반적으로 코드 워드에 분수의 비트를 할당합니다. 물론 불가능합니다. 그러나 이상적인 코드는 문자의 확률이 2의 음수 (즉 1/2, 1/4, 1/8 등) 인 경우 정수를가집니다. –