Zlib 모듈
Zlib 모듈
Zlib는 zlib 라이브러리에 접근할 수 있게 해주는 모듈이에요. zlib은 이식성 높고 무료이며 일반 목적의, 특허에 묶이지 않은 무손실 데이터 압축 라이브러리로, 거의 모든 하드웨어·운영체제에서 쓸 수 있도록 설계되었어요.
본문
zlib 압축 라이브러리는 메모리 안에서의 압축·해제 함수(압축되지 않은 데이터의 무결성 검사 포함)를 제공해요.
zlib 압축 데이터 형식은 RFC 1950에 정의되어 있고, 이는 RFC 1951에 정의된 deflate 스트림을 감싸는 래퍼 형태예요.
또한 이 라이브러리는 IO와 비슷한 인터페이스로 gzip(.gz) 형식의 파일 읽기·쓰기도 지원해요. gzip 형식은 RFC 1952에 정의되어 있으며, 이것 역시 deflate 스트림을 감싸는 형태예요.
- zlib 형식은 메모리와 통신 채널에서 쓰기 좋게 컴팩트하고 빠르게 설계되었어요.
- gzip 형식은 파일시스템에서 단일 파일 압축용으로 설계되어, 디렉터리 정보를 유지하기 위해 zlib보다 큰 헤더를 가지며, zlib과는 다른 더 느린 검사 방식을 사용해요.
추가 정보는 시스템의 zlib.h를 참고하세요.
샘플 사용법
래퍼를 사용해 기본 파라미터로 문자열을 압축하는 건 아주 간단해요.
require "zlib"
data_to_compress = File.read("don_quixote.txt")
puts "Input size: #{data_to_compress.size}"
#=> Input size: 2347740
data_compressed = Zlib::Deflate.deflate(data_to_compress)
puts "Compressed size: #{data_compressed.size}"
#=> Compressed size: 887238
uncompressed_data = Zlib::Inflate.inflate(data_compressed)
puts "Uncompressed data is: #{uncompressed_data}"
#=> Uncompressed data is: The Project Gutenberg EBook of Don Quixote...
Zlib::Deflate.deflate로 압축하고 Zlib::Inflate.inflate로 다시 푸는 기본 흐름을 보여줘요.
클래스 트리
Zlib::Deflate,Zlib::Inflate,Zlib::ZStreamZlib::Error—Zlib::StreamEnd,Zlib::NeedDict,Zlib::DataError,Zlib::StreamError,Zlib::MemError,Zlib::BufError,Zlib::VersionError,Zlib::InProgressError- GZIP_SUPPORT가 있으면:
Zlib::GzipReader,Zlib::GzipWriter,Zlib::GzipFile—Zlib::GzipFile::Error,Zlib::GzipFile::LengthError,Zlib::GzipFile::CRCError,Zlib::GzipFile::NoFooter
상수 (Constants)
압축 레벨·전략 관련:
NO_COMPRESSION— 압축 안 함. 데이터를 그대로 통과시킴. 미리 압축된 데이터를 deflate 스트림에 이어붙일 때 사용BEST_SPEED— 가장 빠른 압축 레벨이지만 공간 절약은 가장 낮음BEST_COMPRESSION— 가장 느린 압축 레벨이지만 공간 절약은 가장 큼DEFAULT_COMPRESSION— 공간과 시간의 좋은 절충점인 기본 압축 레벨DEFAULT_STRATEGY— 일반 데이터에 쓰는 기본 deflate 전략
플러시 방식 관련:
NO_FLUSH— 기본 플러시 방식. deflate가 압축을 최대화하기 위해 얼마나 데이터를 모아서 출력할지 결정SYNC_FLUSH— 대기 중인 출력을 모두 출력 버퍼로 플러시하고 바이트 경계에 정렬. 플러시가 압축률을 떨어뜨릴 수 있어 네트워크 스트림의 요청/응답 경계처럼 필요할 때만 써야 함FULL_FLUSH—SYNC_FLUSH처럼 모든 출력을 플러시하되 압축 상태도 리셋. 이전 압축 데이터가 손상됐거나 임의 접근이 필요할 때 이 지점부터 해제를 재시작할 수 있게 해줌. 남용하면 압축률이 심각하게 떨어짐FINISH— 대기 중인 모든 입력을 처리하고 대기 중인 출력을 플러시
압축 전략 관련:
FILTERED— 필터(또는 예측기)가 만든 데이터용 deflate 전략. 문장 매칭보다 Huffman 코드를 더 쓰게 강제.DEFAULT_STRATEGY와HUFFMAN_ONLY의 중간 성격HUFFMAN_ONLY— Huffman 코드만 사용(문장 매칭 없음)RLE—HUFFMAN_ONLY만큼 빠르면서 PNG 이미지 데이터에는 더 나은 압축을 주도록 설계된 전략FIXED— 동적 Huffman 코드를 금지해 특수 애플리케이션에서 더 단순한 디코더를 가능하게 하는 전략
메모리 관련:
DEF_MEM_LEVEL— zlib deflate 압축 상태 할당의 기본 메모리 레벨MAX_MEM_LEVEL— zlib deflate 압축 상태 할당의 최대 메모리 레벨MAX_WBITS— zlib 히스토리 버퍼의 최대 크기. 더 큰 값을 허용해 다른 inflate 모드를 쓰게 할 수 있음(Zlib::Inflate.new참고)
데이터 타입 관련:
BINARY— deflate가 추정한 이진 데이터를 나타냄TEXT/ASCII— deflate가 추정한 텍스트 데이터를 나타냄(ASCII는 zlib 1.2.2에서TEXT로 폐기된Z_ASCII기반이라 새 앱에서는 쓰지 말 것)UNKNOWN— deflate가 추정한 알 수 없는 데이터 타입
OS 코드 (OS_CODE 관련, OS_* 상수들): OS_CODE는 현재 호스트의 OS 코드. OS_UNIX, OS_WIN32, OS_MSDOS, OS_MACOS, OS_AMIGA, OS_ATARI, OS_CPM, OS_OS2, OS_QDOS, OS_RISCOS, OS_TOPS20, OS_VMCMS, OS_VMS, OS_ZSYSTEM, OS_UNKNOWN 등이 각 플랫폼의 OS 코드를 나타내요.
버전 관련:
VERSION— Ruby/zlib 버전 문자열ZLIB_VERSION—zlib.h의 버전을 나타내는 문자열
Public Class Methods
adler32(string, adler)
string의 Adler-32 체크섬을 계산하고 adler의 갱신된 값을 돌려줘요.
string을 생략하면 Adler-32 초기값을 돌려줘요.adler를 생략하면 초기값이 주어진 것으로 가정해요.string이IO인스턴스면IO가nil을 반환할 때까지 읽어, 읽은 전체 데이터의 Adler-32를 돌려줘요.
require "zlib"
data = "foo"
puts "Adler32 checksum: #{Zlib.adler32(data).to_s(16)}"
#=> Adler32 checksum: 2820145
Adler-32는 CRC-32보다 계산이 빠르지만 덜 강력한 체크섬이에요.
adler32_combine(adler1, adler2, len2)
두 개의 Adler-32 검사값을 하나로 합쳐요. adler1은 첫 번째 값, adler2는 두 번째 값, len2는 adler2를 만드는 데 사용된 문자열의 길이예요.
crc32(string, crc)
string의 CRC 체크섬을 계산하고 crc의 갱신된 값을 돌려줘요. 인자 규칙은 adler32와 동일해요.
crc32_combine(crc1, crc2, len2)
두 개의 CRC-32 검사값을 하나로 합쳐요. crc1은 첫 번째, crc2는 두 번째 값, len2는 crc2 생성에 쓰인 문자열 길이예요.
crc_table()
CRC 체크섬 계산에 쓰이는 테이블을 배열로 돌려줘요.
deflate(string[, level])
주어진 string을 압축해요. level의 유효한 값은 Zlib::NO_COMPRESSION, Zlib::BEST_SPEED, Zlib::BEST_COMPRESSION, Zlib::DEFAULT_COMPRESSION, 또는 0~9 사이의 정수예요.
이 메서드는 다음 코드와 거의 동일해요.
def deflate(string, level)
z = Zlib::Deflate.new(level)
dst = z.deflate(string, Zlib::FINISH)
z.close
dst
end
Zlib.inflate도 함께 참고하세요.
gunzip(src) → String
주어진 gzip 압축 string을 디코드해요.
이 메서드는 다음 코드와 거의 동일해요.
def gunzip(string)
sio = StringIO.new(string)
gz = Zlib::GzipReader.new(sio, encoding: Encoding::ASCII_8BIT)
gz.read
ensure
gz&.close
end
Zlib.gzip도 함께 참고하세요.
gzip(src, level: nil, strategy: nil) → String
주어진 string을 gzip으로 압축해요. level의 유효한 값은 위와 동일하며 기본은 DEFAULT_COMPRESSION이에요.
이 메서드는 다음 코드와 거의 동일해요.
def gzip(string, level: nil, strategy: nil)
sio = StringIO.new
sio.binmode
gz = Zlib::GzipWriter.new(sio, level, strategy)
gz.write(string)
gz.close
sio.string
end
Zlib.gunzip도 함께 참고하세요.
inflate(string)
string을 해제해요. 해제에 사전(dictionary)이 필요하면 Zlib::NeedDict 예외를 던져요.
이 메서드는 다음 코드와 거의 동일해요.
def inflate(string)
zstream = Zlib::Inflate.new
buf = zstream.inflate(string)
zstream.finish
zstream.close
buf
end
Zlib.deflate도 함께 참고하세요.
zlib_version()
zlib 라이브러리의 버전을 나타내는 문자열을 돌려줘요.