Share
Embed
Transcript
13 slides
-
compress is ... • http://golang.org/pkg/compress/ • いわゆる圧縮ファイルを扱うもの – なんか⾒見見てみたらGoで全部書いてある –
libzlibとかに依存せずgoで完結してる • 複数の圧縮ファイルフォーマットに対応 – bzip2 – zlib – gzip – lzw -
実装されている圧縮アルゴリズム • bzip2 – Bw変換を⽤用いた圧縮アルゴリズム。 – 遅いが圧縮率率率が⾼高い • flate(bzip, zlib)
– zipで⽤用いられている圧縮アルゴリズム(Deflate) – LZ77 + ハフマン符号 • lzw – deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い – LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ -
• bzip2 – Bw変換を⽤用いた圧縮アルゴリズム。 – 遅いが圧縮率率率が⾼高い • flate(bzip, zlib) –
zipで⽤用いられている圧縮アルゴリズム(Deflate) – LZ77 + ハフマン符号 • lzw – deflateと⽐比べると⾼高速だが圧縮効率率率が若若⼲干悪い – LZ78の改良良アルゴリズム。gifで使われていて昔 特許で騒がれたアレ 実装されている圧縮アルゴリズム 圧縮アルゴリズムは共通で、ファイル形式のみ異異なる -
compress/*の使い⽅方 • 基本的な使い⽅方はどれも同じ – 圧縮ファイルを扱う際は… • NewReaderで圧縮ファイル読み込み⽤用Reader作成 –
物によっては辞書や圧縮オプションを指定可能(ただし圧 縮時に利利⽤用した物を指定しないとerror) • NewWriterで圧縮ファイル作成⽤用Writer作成 – ものによって辞書(LZ77⽅方式で利利⽤用する初期⽂文脈?)と圧縮 オプションを指定可能 – Bzip2は伸張のみサポート – 微妙にIFが異異なる • Exampleがあるzlibから紹介 • h9p://play.golang.org/p/GH6_Mtoaek -
compress/zlib • func NewReader(r io.Reader) (io.ReadCloser, error) • func
NewReaderDict(r io.Reader, dict []byte) (io.ReadCloser, error) • type Writer – func NewWriter(w io.Writer) *Writer – func NewWriterLevel(w io.Writer, level int) (*Writer, error) – func NewWriterLevelDict(w io.Writer, level int, dict []byte) (*Writer, error) – func (z *Writer) Close() error – func (z *Writer) Flush() error – func (z *Writer) Reset(w io.Writer) – func (z *Writer) Write(p []byte) (n int, err error) • その他、圧縮オプションに関する定数値、エラー型を定義 • 中でflateを呼んでいる -
compress/flate • func NewReader(r io.Reader) io.ReadCloser • func NewReaderDict(r
io.Reader, dict []byte) io.ReadCloser • type CorruptInputError – func (e CorruptInputError) Error() string • type InternalError – func (e InternalError) Error() string • type ReadError – func (e *ReadError) Error() string • type Reader • type WriteError – func (e *WriteError) Error() string • type Writer – func NewWriter(w io.Writer, level int) (*Writer, error) – func NewWriterDict(w io.Writer, level int, dict []byte) (*Writer, error) – func (w *Writer) Close() error – func (w *Writer) Flush() error – func (w *Writer) Reset(dst io.Writer) – func (w *Writer) Write(data []byte) (n int, err error) • その他、圧縮オプションに関する定数値、エラー型を定義 -
compress/gzip • type Header • type Reader –
func NewReader(r io.Reader) (*Reader, error) – func (z *Reader) Close() error – func (z *Reader) Read(p []byte) (n int, err error) • type Writer – func NewWriter(w io.Writer) *Writer – func NewWriterLevel(w io.Writer, level int) (*Writer, error) – func (z *Writer) Close() error – func (z *Writer) Flush() error – func (z *Writer) Reset(w io.Writer) – func (z *Writer) Write(p []byte) (int, error) • その他、圧縮オプションに関する定数値、エラー型を定義 • gzipは独⾃自のヘッダ型がある • 中でflateを呼んでいる -
compress/bzip2 • func NewReader(r io.Reader) io.Reader • type StructuralError
– func (s StructuralError) Error() string • Block sort(BW変換)のgo実装読んでみた かったけど圧縮は未対応だった -
compress/lzw • func NewReader(r io.Reader, order Order, litWidth int)
io.ReadCloser • func NewWriter(w io.Writer, order Order, litWidth int) io.WriteCloser • type Order