РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1348 of 1593 menu

Пакет compress/zlib

Пакет compress/zlib реализует сжатие и распаковку данных в формате zlib. Для сжатия данных используется функция zlib.NewWriter, которая принимает io.Writer и возвращает указатель на писатель, использующий алгоритм Deflate. Для распаковки данных используется функция zlib.NewReader, которая принимает io.Reader и возвращает объект для чтения распакованных данных.

Сжатие данных с zlib.NewWriter

Давайте сожмем строку 'abcde' в формате zlib и запишем результат в буфер:

package main import ( "bytes" "compress/zlib" "fmt" "io" ) func main() { var buf bytes.Buffer w := zlib.NewWriter(&buf) text := []byte("abcde") w.Write(text) w.Close() fmt.Println(buf.Bytes()) }

Результат выполнения кода:

[120 156 75 76 76 44 45 1 0 2 172 1 230]

В данном примере мы создаем буфер, инициализируем писатель zlib, записываем в него строку и закрываем писатель. В результате получаем сжатые данные в формате zlib.

Распаковка данных с zlib.NewReader

Давайте распакуем данные, сжатые в предыдущем примере:

package main import ( "bytes" "compress/zlib" "fmt" "io" ) func main() { compressed := []byte{120, 156, 75, 76, 76, 44, 45, 1, 0, 2, 172, 1, 230} buf := bytes.NewReader(compressed) r, err := zlib.NewReader(buf) if err != nil { fmt.Println("Error:", err) return } defer r.Close() res, err := io.ReadAll(r) if err != nil { fmt.Println("Error:", err) return } fmt.Println(string(res)) }

Результат выполнения кода:

"abcde"

Мы создаем ридер из сжатых данных, используем zlib.NewReader для распаковки и считываем результат с помощью io.ReadAll. В результате получаем исходную строку.

Сжатие с выбором уровня сжатия

Функция zlib.NewWriterLevel позволяет указать уровень сжатия. Доступны константы zlib.BestSpeed, zlib.BestCompression и zlib.DefaultCompression:

package main import ( "bytes" "compress/zlib" "fmt" ) func main() { var buf bytes.Buffer w, err := zlib.NewWriterLevel(&buf, zlib.BestCompression) if err != nil { fmt.Println("Error:", err) return } text := []byte("abcde") w.Write(text) w.Close() fmt.Println(buf.Bytes()) }

Результат выполнения кода:

[120 156 75 76 76 44 45 1 0 2 172 1 230]

При использовании уровня сжатия BestCompression алгоритм затрачивает больше времени на сжатие, но достигает меньшего размера выходных данных.

Обработка ошибок при распаковке

Функция zlib.NewReader возвращает ошибку, если переданные данные не являются корректным потоком zlib:

package main import ( "bytes" "compress/zlib" "fmt" ) func main() { invalidData := []byte{1, 2, 3, 4, 5} buf := bytes.NewReader(invalidData) _, err := zlib.NewReader(buf) if err != nil { fmt.Println(err) } }

Результат выполнения кода:

"zlib: invalid header"

В этом примере мы пытаемся распаковать невалидные данные и получаем соответствующую ошибку о некорректном заголовке zlib.

Смотрите также

  • пакет compress/gzip,
    который предоставляет аналогичный функционал, но в формате gzip
  • функцию zlib.NewReader,
    которая создает ридер для распаковки данных zlib
  • функцию zlib.NewWriter,
    которая создает писатель для сжатия данных в формате zlib
  • пакет compress/flate,
    который реализует базовый алгоритм Deflate, используемый в zlib
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить