Пакет compress/lzw
Пакет compress/lzw реализует алгоритм сжатия LZW,
который используется в форматах GIF и TIFF.
Пакет предоставляет две основные функции: NewReader
для декомпрессии и NewWriter для компрессии данных.
При работе с компрессией необходимо указать порядок байт
(LSB или MSB) и максимальное количество
бит для кодов.
Синтаксис
Для создания нового читателя используется функция:
func NewReader(r io.Reader, order Order, litWidth int) io.ReadCloser
Параметр r представляет источник сжатых данных,
order определяет порядок бит (lzw.LSB или
lzw.MSB), а litWidth указывает минимальное
количество бит для кодов символов (обычно 8).
Для создания нового писателя используется функция:
func NewWriter(w io.Writer, order Order, litWidth int) io.WriteCloser
Параметр w представляет поток вывода,
order и litWidth аналогичны функции
NewReader.
Пример сжатия данных
Давайте сожмем строку с использованием алгоритма LZW:
package main
import (
"bytes"
"compress/lzw"
"fmt"
"io"
)
func main() {
data := "example text for compression"
var buf bytes.Buffer
writer := lzw.NewWriter(&buf, lzw.MSB, 8)
_, err := writer.Write([]byte(data))
if err != nil {
fmt.Println("Error writing:", err)
return
}
err = writer.Close()
if err != nil {
fmt.Println("Error closing:", err)
return
}
fmt.Printf("Compressed data length: %d bytes\n", buf.Len())
fmt.Printf("Original data length: %d bytes\n", len(data))
}
Результат выполнения кода:
"Compressed data length: 30 bytes"
"Original data length: 24 bytes"
Пример декомпрессии данных
Давайте распакуем сжатые данные обратно в исходную строку:
package main
import (
"bytes"
"compress/lzw"
"fmt"
"io"
)
func main() {
original := "example text for compression"
var compressed bytes.Buffer
writer := lzw.NewWriter(&compressed, lzw.MSB, 8)
_, err := writer.Write([]byte(original))
if err != nil {
fmt.Println("Error writing:", err)
return
}
writer.Close()
reader := lzw.NewReader(&compressed, lzw.MSB, 8)
defer reader.Close()
decompressed, err := io.ReadAll(reader)
if err != nil {
fmt.Println("Error reading:", err)
return
}
res := string(decompressed)
fmt.Println(res)
}
Результат выполнения кода:
"example text for compression"
Пример с разными порядками байт
Пакет поддерживает два порядка байт: lzw.LSB (младший
бит первым) и lzw.MSB (старший бит первым). Выбор
порядка зависит от формата данных:
package main
import (
"bytes"
"compress/lzw"
"fmt"
"io"
)
func main() {
data := "12345"
var buf bytes.Buffer
writerMSB := lzw.NewWriter(&buf, lzw.MSB, 8)
writerMSB.Write([]byte(data))
writerMSB.Close()
readerMSB := lzw.NewReader(&buf, lzw.MSB, 8)
decodedMSB, _ := io.ReadAll(readerMSB)
readerMSB.Close()
buf.Reset()
writerLSB := lzw.NewWriter(&buf, lzw.LSB, 8)
writerLSB.Write([]byte(data))
writerLSB.Close()
readerLSB := lzw.NewReader(&buf, lzw.LSB, 8)
decodedLSB, _ := io.ReadAll(readerLSB)
readerLSB.Close()
resMSB := string(decodedMSB)
resLSB := string(decodedLSB)
fmt.Println("MSB:", resMSB)
fmt.Println("LSB:", resLSB)
}
Результат выполнения кода:
"MSB: 12345"
"LSB: 12345"
Смотрите также
-
функцию
lzw.NewReader,
которая создает читателя для распаковки LZW-данных -
функцию
lzw.NewWriter,
которая создает писателя для упаковки данных в LZW -
пакет
compress/gzip,
который реализует сжатие в формате gzip -
пакет
compress/zlib,
который реализует сжатие в формате zlib