Функция lzw.NewReader

Функция lzw.NewReader создает новый объект io.ReadCloser для чтения LZW-сжатых данных. В первый параметр она принимает io.Reader, из которого будут читаться сжатые данные. Во второй параметр принимает порядок битов в байте - константу lzw.LSB или lzw.MSB. В третий параметр принимает размер литерала - количество бит для кодирования символов. Функция возвращает io.ReadCloser, который следует закрыть после чтения.

Синтаксис

golzw.NewReader(r io.Reader, order lzw.Order, litWidth int) io.ReadCloser

Пример

Давайте создадим читатель для LZW-сжатых данных с порядком битов lzw.MSB и размером литерала 8:

gopackage main

import (
  "bytes"
  "compress/lzw"
  "fmt"
  "io"
)

func main() {
  // Подготовим сжатые данные
  data := []byte{0x4c, 0x5a, 0x57, 0x20, 0x64, 0x61, 0x74, 0x61}
  buf := bytes.NewReader(data)

  // Создаем читатель для LZW-сжатых данных
  reader := lzw.NewReader(buf, lzw.MSB, 8)

  // Читаем данные
  res, err := io.ReadAll(reader)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  // Закрываем читатель
  err = reader.Close()
  if err != nil {
    fmt.Println("Error closing:", err)
    return
  }

  fmt.Println(string(res))
}

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

go"LZW data"

Пример

Давайте создадим читатель для LZW-сжатых данных с порядком битов lzw.LSB и размером литерала 9:

gopackage main

import (
  "bytes"
  "compress/lzw"
  "fmt"
  "io"
)

func main() {
  // Подготовим сжатые данные
  data := []byte{0x01, 0x02, 0x03, 0x04, 0x05}
  buf := bytes.NewReader(data)

  // Создаем читатель для LZW-сжатых данных
  reader := lzw.NewReader(buf, lzw.LSB, 9)

  // Читаем данные
  res, err := io.ReadAll(reader)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  // Закрываем читатель
  err = reader.Close()
  if err != nil {
    fmt.Println("Error closing:", err)
    return
  }

  fmt.Printf("%x\n", res)
}

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

go"0102030405"

Пример

Давайте создадим читатель для распаковки LZW-сжатой строки с использованием буфера:

gopackage main

import (
  "bytes"
  "compress/lzw"
  "fmt"
  "io"
)

func main() {
  // Создаем буфер с LZW-сжатыми данными
  var compressed bytes.Buffer
  writer := lzw.NewWriter(&compressed, lzw.MSB, 8)

  // Записываем данные для сжатия
  _, err := writer.Write([]byte("Hello, LZW!"))
  if err != nil {
    fmt.Println("Error writing:", err)
    return
  }

  // Закрываем writer для завершения сжатия
  err = writer.Close()
  if err != nil {
    fmt.Println("Error closing writer:", err)
    return
  }

  // Создаем читатель для распаковки
  reader := lzw.NewReader(&compressed, lzw.MSB, 8)

  // Распаковываем данные
  res, err := io.ReadAll(reader)
  if err != nil {
    fmt.Println("Error reading:", err)
    return
  }

  // Закрываем читатель
  err = reader.Close()
  if err != nil {
    fmt.Println("Error closing reader:", err)
    return
  }

  fmt.Println(string(res))
}

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

go"Hello, LZW!"

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

  • функцию lzw.NewWriter,
    которая создает писатель для LZW-сжатия данных
  • пакет gzip,
    который реализует сжатие в формате gzip
  • функцию flate.NewReader,
    которая создает читатель для DEFLATE-сжатых данных
  • функцию zlib.NewReader,
    которая создает читатель для zlib-сжатых данных