Class: Hpack::Huffman

Inherits:
Object
  • Object
show all
Defined in:
lib/hpack/huffman.rb

Constant Summary collapse

HUFFMAN =
[
  "1111111111000",
  "11111111111111111011000",
  "1111111111111111111111100010",
  "1111111111111111111111100011",
  "1111111111111111111111100100",
  "1111111111111111111111100101",
  "1111111111111111111111100110",
  "1111111111111111111111100111",
  "1111111111111111111111101000",
  "111111111111111111101010",
  "111111111111111111111111111100",
  "1111111111111111111111101001",
  "1111111111111111111111101010",
  "111111111111111111111111111101",
  "1111111111111111111111101011",
  "1111111111111111111111101100",
  "1111111111111111111111101101",
  "1111111111111111111111101110",
  "1111111111111111111111101111",
  "1111111111111111111111110000",
  "1111111111111111111111110001",
  "1111111111111111111111110010",
  "111111111111111111111111111110",
  "1111111111111111111111110011",
  "1111111111111111111111110100",
  "1111111111111111111111110101",
  "1111111111111111111111110110",
  "1111111111111111111111110111",
  "1111111111111111111111111000",
  "1111111111111111111111111001",
  "1111111111111111111111111010",
  "1111111111111111111111111011",
  "010100",
  "1111111000",
  "1111111001",
  "111111111010",
  "1111111111001",
  "010101",
  "11111000",
  "11111111010",
  "1111111010",
  "1111111011",
  "11111001",
  "11111111011",
  "11111010",
  "010110",
  "010111",
  "011000",
  "00000",
  "00001",
  "00010",
  "011001",
  "011010",
  "011011",
  "011100",
  "011101",
  "011110",
  "011111",
  "1011100",
  "11111011",
  "111111111111100",
  "100000",
  "111111111011",
  "1111111100",
  "1111111111010",
  "100001",
  "1011101",
  "1011110",
  "1011111",
  "1100000",
  "1100001",
  "1100010",
  "1100011",
  "1100100",
  "1100101",
  "1100110",
  "1100111",
  "1101000",
  "1101001",
  "1101010",
  "1101011",
  "1101100",
  "1101101",
  "1101110",
  "1101111",
  "1110000",
  "1110001",
  "1110010",
  "11111100",
  "1110011",
  "11111101",
  "1111111111011",
  "1111111111111110000",
  "1111111111100",
  "11111111111100",
  "100010",
  "111111111111101",
  "00011",
  "100011",
  "00100",
  "100100",
  "00101",
  "100101",
  "100110",
  "100111",
  "00110",
  "1110100",
  "1110101",
  "101000",
  "101001",
  "101010",
  "00111",
  "101011",
  "1110110",
  "101100",
  "01000",
  "01001",
  "101101",
  "1110111",
  "1111000",
  "1111001",
  "1111010",
  "1111011",
  "111111111111110",
  "11111111100",
  "11111111111101",
  "1111111111101",
  "1111111111111111111111111100",
  "11111111111111100110",
  "1111111111111111010010",
  "11111111111111100111",
  "11111111111111101000",
  "1111111111111111010011",
  "1111111111111111010100",
  "1111111111111111010101",
  "11111111111111111011001",
  "1111111111111111010110",
  "11111111111111111011010",
  "11111111111111111011011",
  "11111111111111111011100",
  "11111111111111111011101",
  "11111111111111111011110",
  "111111111111111111101011",
  "11111111111111111011111",
  "111111111111111111101100",
  "111111111111111111101101",
  "1111111111111111010111",
  "11111111111111111100000",
  "111111111111111111101110",
  "11111111111111111100001",
  "11111111111111111100010",
  "11111111111111111100011",
  "11111111111111111100100",
  "111111111111111011100",
  "1111111111111111011000",
  "11111111111111111100101",
  "1111111111111111011001",
  "11111111111111111100110",
  "11111111111111111100111",
  "111111111111111111101111",
  "1111111111111111011010",
  "111111111111111011101",
  "11111111111111101001",
  "1111111111111111011011",
  "1111111111111111011100",
  "11111111111111111101000",
  "11111111111111111101001",
  "111111111111111011110",
  "11111111111111111101010",
  "1111111111111111011101",
  "1111111111111111011110",
  "111111111111111111110000",
  "111111111111111011111",
  "1111111111111111011111",
  "11111111111111111101011",
  "11111111111111111101100",
  "111111111111111100000",
  "111111111111111100001",
  "1111111111111111100000",
  "111111111111111100010",
  "11111111111111111101101",
  "1111111111111111100001",
  "11111111111111111101110",
  "11111111111111111101111",
  "11111111111111101010",
  "1111111111111111100010",
  "1111111111111111100011",
  "1111111111111111100100",
  "11111111111111111110000",
  "1111111111111111100101",
  "1111111111111111100110",
  "11111111111111111110001",
  "11111111111111111111100000",
  "11111111111111111111100001",
  "11111111111111101011",
  "1111111111111110001",
  "1111111111111111100111",
  "11111111111111111110010",
  "1111111111111111101000",
  "1111111111111111111101100",
  "11111111111111111111100010",
  "11111111111111111111100011",
  "11111111111111111111100100",
  "111111111111111111111011110",
  "111111111111111111111011111",
  "11111111111111111111100101",
  "111111111111111111110001",
  "1111111111111111111101101",
  "1111111111111110010",
  "111111111111111100011",
  "11111111111111111111100110",
  "111111111111111111111100000",
  "111111111111111111111100001",
  "11111111111111111111100111",
  "111111111111111111111100010",
  "111111111111111111110010",
  "111111111111111100100",
  "111111111111111100101",
  "11111111111111111111101000",
  "11111111111111111111101001",
  "1111111111111111111111111101",
  "111111111111111111111100011",
  "111111111111111111111100100",
  "111111111111111111111100101",
  "11111111111111101100",
  "111111111111111111110011",
  "11111111111111101101",
  "111111111111111100110",
  "1111111111111111101001",
  "111111111111111100111",
  "111111111111111101000",
  "11111111111111111110011",
  "1111111111111111101010",
  "1111111111111111101011",
  "1111111111111111111101110",
  "1111111111111111111101111",
  "111111111111111111110100",
  "111111111111111111110101",
  "11111111111111111111101010",
  "11111111111111111110100",
  "11111111111111111111101011",
  "111111111111111111111100110",
  "11111111111111111111101100",
  "11111111111111111111101101",
  "111111111111111111111100111",
  "111111111111111111111101000",
  "111111111111111111111101001",
  "111111111111111111111101010",
  "111111111111111111111101011",
  "1111111111111111111111111110",
  "111111111111111111111101100",
  "111111111111111111111101101",
  "111111111111111111111101110",
  "111111111111111111111101111",
  "111111111111111111111110000",
  "11111111111111111111101110",
  "111111111111111111111111111111" # EOS
]

Instance Method Summary collapse

Constructor Details

#initializeHuffman

Returns a new instance of Huffman.



263
264
265
266
267
268
# File 'lib/hpack/huffman.rb', line 263

def initialize
  @root = {}
  HUFFMAN.each_with_index do |code, terminal|
    load_terminal code, terminal
  end
end

Instance Method Details

#decode(input: nil, length: 0) ⇒ Object



285
286
287
288
289
290
291
292
293
294
295
296
297
# File 'lib/hpack/huffman.rb', line 285

def decode input: nil, length: 0
  node = @root

  decode_bits input, length do |bit|
    node = node[bit]

    next nil unless node.include? :value

    char = node[:value]
    node = @root
    char
  end
end

#decode_bits(input, length) ⇒ Object



299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
# File 'lib/hpack/huffman.rb', line 299

def decode_bits input, length
  data = ""
  padding = []

  length.times do |i|
    byte = input.readbyte

    8.times do
      bit = (byte & 0b1000_0000 == 0) && 0 || 1
      char = yield bit

      if char
        data << char
        padding = []
      else
        padding << bit
      end

      byte <<= 1
    end
  end

  # TODO: padding check

  data
end

#load_terminal(code, terminal) ⇒ Object



270
271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/hpack/huffman.rb', line 270

def load_terminal code, terminal
  node = @root

  code.each_char do |bit_sym|
    bit = bit_sym.to_i
    unless node.include? bit
      node[bit] = {}
    end

    node = node[bit]
  end

  node[:value] = terminal
end