Class: Omnizip::Formats::Rar::Rar5::Compression::Lzss::Decoder

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/formats/rar/rar5/compression/lzss.rb

Overview

RAR5 LZSS Decoder

Based on libarchive's do_uncompress_block()

Instance Method Summary collapse

Constructor Details

#initialize(data, window_size) ⇒ Decoder

Returns a new instance of Decoder.



317
318
319
320
321
322
323
324
325
326
327
# File 'lib/omnizip/formats/rar/rar5/compression/lzss.rb', line 317

def initialize(data, window_size)
  @data = data.dup.force_encoding(Encoding::BINARY)
  @window_size = window_size
  @window_mask = window_size - 1
  @window = "\x00" * window_size
  @output = StringIO.new
  @output.set_encoding(Encoding::BINARY)
  @write_ptr = 0
  @dist_cache = [0, 0, 0, 0] # Distance cache
  @last_len = 0
end

Instance Method Details

#decode(expected_size = nil) ⇒ String

Decode the compressed data

Parameters:

  • expected_size (Integer, nil) (defaults to: nil)

    Expected uncompressed size

Returns:

  • (String)

    Decompressed data



333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
# File 'lib/omnizip/formats/rar/rar5/compression/lzss.rb', line 333

def decode(expected_size = nil)
  return "" if @data.empty?

  @bit_reader = BitReader.new(@data)

  # Parse block header
  parse_block_header

  return @output.string unless @table_present

  # Parse Huffman tables
  return @output.string unless parse_huffman_tables

  # Decode data
  decode_data(expected_size)

  @output.string
end