Sha256: 67712cd476aeea2da01d2d9a8f94b756e802f424b65c8bfb9a22a66f79b6990c

Contents?: true

Size: 1.96 KB

Versions: 5

Compression:

Stored size: 1.96 KB

Contents

class BinParser
  def initialize
    @size = 0
    @data = []
    # 0 => reading length
    # 1 => reading actual data
    @parser_state = 0
    @length_string = ""
    @numeric_length = 0
  end

  def extract new_data, &block
    extracter_block = block
    if @parser_state == 0
      length_to_read =  9 - @length_string.length
      len_str,remaining = new_data.unpack("a#{length_to_read}a*")
      if len_str.length < length_to_read
        @length_string << len_str
        return
      else
        @length_string << len_str
        @numeric_length = @length_string.to_i
        @parser_state = 1
        if remaining.length < @numeric_length
          @data << remaining
          @numeric_length = @numeric_length - remaining.length
        elsif remaining.length == @numeric_length
          @data << remaining
          extracter_block.call(@data.join)
          @data = []
          @parser_state = 0
          @length_string = ""
          @numeric_length = 0
        else
          pack_data,remaining = remaining.unpack("a#{@numeric_length}a*")
          @data << pack_data
          extracter_block.call(@data.join)
          @data = []
          @parser_state = 0
          @length_string = ""
          @numeric_length = 0
          extract(remaining,&extracter_block)
        end
      end
    elsif @parser_state == 1
      pack_data,remaining = new_data.unpack("a#{@numeric_length}a*")
      if pack_data.length < @numeric_length
        @data << pack_data
        @numeric_length = @numeric_length - pack_data.length
      elsif pack_data.length == @numeric_length
        @data << pack_data
        extracter_block.call(@data.join)
        @data = []
        @parser_state = 0
        @length_string = ""
        @numeric_length = 0
      else
        @data << pack_data
        extracter_block.call(@data.join)
        @data = []
        @parser_state = 0
        @length_string = ""
        @numeric_length = 0
        extract(remaining,&extracter_block)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
packet-0.1.1 lib/bin_parser.rb
packet-0.1.2 lib/bin_parser.rb
packet-0.1.3 lib/packet/packet_parser.rb
packet-0.1.4 lib/packet/packet_parser.rb
packet-0.1.5 lib/packet/packet_parser.rb