class Protocol::HPACK::Huffman
Implementation of huffman encoding for HPACK.
def self.decode(buffer)
-
(CompressionError)
- when Huffman coded string is malformed
Returns:
-
(String)
- binary string
Parameters:
-
buf
(Buffer
) --
def self.decode(buffer) emit = String.new.b state = 0 # start state mask = (1 << BITS_AT_ONCE) - 1 buffer.each_byte do |c| shift = BITS_AT_ONCE while shift >= 0 branch = (c >> shift) & mask # MACHINE[state] = [final, [transitions]] # [final] unfinished bits so far are prefix of the EOS code. # Each transition is [emit, next] # [emit] character to be emitted on this transition, empty string, or EOS. # [next] next state number. value, state = MACHINE[state][branch] raise CompressionError, "Huffman decode error (EOS found)" if value == EOS emit << value.chr if value shift -= BITS_AT_ONCE end end # Check whether partial input is correctly filled unless state <= MAX_FINAL_STATE raise CompressionError, "Huffman decode error (EOS invalid)" end emit.force_encoding(Encoding::BINARY) end
def self.encode(str)
-
(String)
- binary string
Parameters:
-
str
(String
) --
def self.encode(str) bitstring = str.each_byte.map {|chr| ENCODE_TABLE[chr]}.join bitstring << "1" * ((8 - bitstring.size) % 8) [bitstring].pack("B*") end