우리가 일반적으로 자주 만나는 압축파일 중 상당수가 '. zip' 확장자를 가지고 있습니다.
zip 파일은 'DEFLATE 알고리즘'을 이용하여 압축이 되는데요.
아래의 링크에 간략한 설명이 되어있습니다.
https://ko.wikipedia.org/wiki/DEFLATE
위키백과에 나온 설명을 보면, 다음과 같은 문장이 있는데요.
DEFLATE에 대한 설명임에도, zlib에 대한 설명이 있죠?
zlib은 가장 많이 사용하는 압축 라이브러리 중 하나이며, 라이선스 비용 없이 사용 가능합니다.
덕분에 여러 언어들에서 사용되고 있습니다.
더불어, HTTP, 웹소켓 등에서 기본으로 지원하고 있을 만큼, 표준에 가까운 라이브러리로 자리를 잡았습니다.
압축에서는 역시 압축률이 중요하겠죠?
하지만 원본 데이터를 손실하면서까지, 압축률을 높이는 경우가 있을까요? 네, 있습니다.
이것을 '손실 압축'이라고 하고, 영상이나 오디오 같은 곳에서 많이 쓰입니다.
이용자가 상대적으로 손실을 인지하기 어렵기 때문이죠.
반대로 압축 후, 전부 원복이 가능한 것을 '무손실 압축'이라고 합니다.
DEFLATE 알고리즘도 역시 무손실 압축입니다.
일반적으로 압축보다 해제 시의 속도가 월등히 빠릅니다.
압축은 데이터의 공통된 부분을 하나로 묶어 저장하는데요.
이렇다 보니, 데이터의 패턴을 파악하고 거기에 적합한 알고리즘이 필요해집니다.
하지만 해제는 압축된 데이터를 복원(+체크섬 계산)하고, 압축된 데이터의 체크섬과 일치하는지만 판별하면 되기에 훨씬 빠를 수밖에 없죠.
https://pkg.go.dev/compress/zlib에 간단한 예제가 있는데요. 참고하시면 되겠습니다.
package main
import (
"bytes"
"compress/zlib"
"io"
"os"
)
var b bytes.Buffer
func main() {
compress()
decompress()
}
func compress() {
w := zlib.NewWriter(&b)
w.Write([]byte("hello, world\n"))
w.Close()
}
func decompress() {
r, err := zlib.NewReader(&b)
if err != nil {
panic(err)
}
io.Copy(os.Stdout, r)
r.Close()
}
Go - 복합 타입 (1) (0) | 2022.11.03 |
---|---|
Go - 기본적인 데이터 타입과 선언 (2) (0) | 2022.11.02 |
Go - 기본적인 데이터 타입과 선언 (1) (0) | 2022.11.01 |
Go를 이용하여 가볍게 알아보는 Base64 (0) | 2022.06.10 |
댓글 영역