2012-05-06 6 views
1

파일 압축 프로그램을 개발 중입니다. 우리는 현재 압축 된 .ZIP 아카이버를 생성 할 때 다른 평판 좋은 압축기 (예 : 7zip)가 완벽하게 이해/압축 해제 할 수 있도록 .ZIP 아카이버 스탠드 아트를 구현하고 있습니다.Deflate의 동적 허프만 인코딩 - RFC 1951

우리는 지금 우리는 고정 된 코드는 따라서 리터럴 길이 + 거리 값 작업의 RFC와 완벽하게 호환 작업과 코딩 LZ77과 허프만의 변형은 RFC 1951
에 따라 DEFLATE 알고리즘을 개발하고있다.

Dynamic Huffman Coding에서는 현재 다른 압축 된 데이터 (다른 안정적인 압축기를 통해 압축 됨)에서 허프만 트리를 추출 할 수 있지만 실제 데이터를 압축 해제 할 때가되면 잘못된 값이 표시됩니다.
아마도 나는 잘못된 방식으로 나무를 읽고 있습니다.

나는 정확한 값으로 이러한 나무의 값이 압축 된 데이터에 저장되는 방법을 설명하는 장소를 구체적으로 발견하지 못했습니다.

고정 된 huffman 인코딩에서와 같은 방식으로 RFC에서 설명한대로 리터럴/거리 당 상응하는 추가 비트와 동일한 리터럴 길이 값 (0 ~ 285) + 거리 (0 ~ 30)를 따르는 것으로 가정합니다. 이 고정 허프만 부호화에 저장된

방법은 Huffman 부호 메모리의 적어도 최상위 비트에 부호의 가장 중요한 비트에 저장된다는 점이다. 이렇게하면 인코딩 트리를 비트 단위로 탐색 할 수 있습니다.
허프만 코드의 추가 비트은 다른 방법으로 저장됩니다.

Dynamic Huffman Coding은 같은 방식으로 저장합니까?

내가 누락되었거나 알고 있어야하는 것이 있습니까?

답변

7

우선 상업적인 사용을 허용하는 무료 압축 라이브러리 인 zlib에서 이미 수행되었으므로 수행 할 필요가 없습니다. zlib은 RFC 1951에 따라 압축 압축 및 압축 해제 압축 구현을 제공합니다. zlib 소스 코드 패키지에 제 3 자 제공 물인 minizip 또는 libzip을 사용하여 zlib을 사용하여 zip 파일을 처리 할 수 ​​있습니다.

직접 작성하려는 경우 zuff 배포판에서 puff.c를 볼 수 있습니다.이 패키지는 RFC 1951을 보완하기위한 목적으로 작성되었습니다. 무겁게 논평 한 작동 deflate 디코더.

RFC 1951은 실제로 정확도가있는 형식을 설명합니다. 신중하게 읽어야합니다. puff.c는 학습 과정을 가속화하는 데 도움이 될 수 있습니다.

비 고정 허프만 코딩의 올바른 용어는 "동적"입니다. "적응성"이 아닙니다. 그 이유는 "적응 형 허프만"이라는 용어는 수포식 형식으로 사용되지 않는 특별한 기술을 말합니다. 허프 먼 트리가 실제로 데이터를 따라 이동하면서 변형되는 특수 기술입니다. deflate가 사용하는 Dynamic Huffman 코딩은 데이터를 블록으로 나누고 블록 전체에 걸쳐 일정한 각 블록에 대해 완전한 허프만 코드를 보냅니다.

예, 동적 허프만 코드 및 추가 비트는 고정 된 허프만 코드와 동일한 순서로 저장됩니다.까다로운 부분은 허프만 코드가 각 블록의 수축 스트림 헤더에서 어떻게 전송되는지 이해하는 것입니다.

+0

시간 내 주셔서 감사합니다. > 스스로하려는 경우 [..] < 사실 그 경우입니다. > 고정되지 않은 허프만 코딩의 올바른 용어는 "동적"입니다. "적응력이 없다". < 오, 사실 내가 읽은 것으로부터 그것을 놓쳤습니다. 그냥 편집했습니다. 감사하게도 나는 수축에 의해 압축 된 모든 블록이 자체의 허프만 인코딩 트리를 가지고 있다는 것을 이해했다. 나는 입력으로부터 정보를 읽는 트리를 실제로 생성하고있다. 그런 다음, 읽으려는 의도를 이해함에 따라 그것을 다시 읽고 인코딩한다. 나는 puff.c를 읽고있다. 나에게 그것을 가르쳐 주셔서 고마워. 감사합니다. – Fonserbc

0

나는 허프만 코드의 여분의 비트가 저장되는 방식에 대해 오인 될 수 있다고 생각한다. RFC1951은 여분의 비트 표현에 대한 다음을 말한다 : 예를 들면, 비트 (1110)의 값을 나타내는

여분 비트

가 먼저 최상위 비트가 저장된 기계 정수로 해석되어야한다 (14)

여분의 비트는 부분의 호프만 코드이므로 같은 순서로 읽습니다. 다른 말로하면 길이와 문자의 알파벳 269가 비트 스트링 "1010"으로 감겨지면 길이 19-22 코드 101000, 101001, 101010 및 101011이 각각 있습니다.)

+0

실제로 RFC는 그 진술에 잘못되었습니다. 그리고 나는 이것에 물렸다. 추가 비트는 아카이브의 다른 비트 필드와 마찬가지로 LSB 먼저 읽혀 야합니다. – Calmarius