Block과 Flush


Deflate 알고리즘은 LZ77과 Huffman Coding으로 압축됩니다.

LZ77 알고리즘은 이전 버퍼 데이터에 의존해서 압축하는 구조입니다. 어떤 경우에는 앞 버퍼를 비우고 압축을 해야할 필요가 있습니다. 바로 앞 데이터와 뒤 데이터간 의존성을 없애는 목적입니다. Block은 의존성이 있는 연속된 데이터 구간을 의미합니다. 하나의 압축 결과물은 한개 이상의 Block으로 구성됩니다. 크게 하나의 압축 파일은 헤더부, Block군, 종료부로 나눌 수 있습니다. 만약 Block 용어가 zlib에서 등장한다면 “독립되고 연속 데이터 구간을 생성하는구나.” 라고 생각하면 됩니다. Block마다 window size나 압축 레벨을 다르게 구현해 줄 수 있습니다. 만약 인위적으로 윈도우 사이즈나 압축 레벨을 변경하면 새로운 Block이 생성됩니다.

Flush라는 용어는 Huffman Coding 알고리즘과 관련된 용어입니다. Huffman Coding 알고리즘은 비트 단위 압축 알고리즘입니다. 문제는 컴퓨터의 기록 단위는 바이트 단위라는 겁니다. 따라서 기록하는 시점에 바이트 바운더리가 자동적으로 채워지게 됩니다. Flush라는 용어는 강제로 빈 비트를 채워서라도 바이트 단위 바운더리 단위로 기록하게 됩니다. 결국 Flush를 적게 할수록 압축율을 올라갑니다.

Block과 Flush는 zlib에서 flush 모드라고 부릅니다.

- 목록:

7 thoughts on “gz 파일 사용하기

  1. 안녕하세요 좋은 영상과 글을 잘 봤습니다.
    글에 보면 “입력 버퍼와 출력 버퍼를 고정으로한 압축 함수”에 대해서 어떤 함수를 봐야 하는지 알수 있을까요?
    좋은 글 감사드리며, 오래된 글에 문의를 남깁니다.
    감사합니다.

  2. 동영상 잘 보았습니다. 궁금한것이 있는데요, Z_SYNC_FLUSH 를 사용할 경우에, 만약 next_out buffer 크기가 압축한 data 를 담기에 충분하지 않는다면, 어떻게 해야 하는지요?

    • Z_SYNC_FLUSH는 쓰고 있는 비트를 모두 바이트 단위로 쓰라는 옵션임으로 일반적인 쓰기 과정에서 발생한 에러 코드를 반환하게 되어 있습니다. [Deflate 샘플] 동영상을 참고하세요.

  3. C로 압축하고 c#으로 압축을 푸는 방법이 있을까요?
    텍스트 파일을 작성시

    gzwritre(파일 포인터, 2019, sizeof(int));
    gzwritre(파일 포인터, 09, sizeof(int));
    gzwritre(파일 포인터, 17, sizeof(int));

    gzwritre(파일 포인터, 0.1, sizeof(float)); 결과값
    gzwritre(파일 포인터, 0.2, sizeof(float));
    gzwritre(파일 포인터, 0.3, sizeof(float));

    gzwritre(파일 포인터, 100.0, sizeof(float));

    이렇게 텍스트 파일을 저장(압축)했는데 C#에서 이 파일을 읽어서

    연 / 월 / 일 을 정수 변수에
    결과값을 실수배열에 저장하고 싶습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>