class GrizzlyBer

Public Class Methods

new(hex_string = "", allow_FF_tags: false) click to toggle source
# File lib/grizzly_ber.rb, line 109
def initialize(hex_string = "", allow_FF_tags: false)
  raise ArgumentError, "hex_string must be a valid hex string" unless hex_string.is_a? String and hex_string.size.even? and hex_string =~ /^[0-9A-F]*$/
  @elements = [] # is an array of GrizzlyBerElement
  @allow_FF_tags = allow_FF_tags
  from_ber_hex_string(hex_string)
end

Public Instance Methods

[](index_or_tag) click to toggle source
# File lib/grizzly_ber.rb, line 138
def [](index_or_tag)
  return value_of_first_element_with_tag(index_or_tag) if index_or_tag.is_a? String
  @elements[index_or_tag]
end
[]=(index_or_tag,value) click to toggle source
# File lib/grizzly_ber.rb, line 143
def []=(index_or_tag,value)
  return set_value_for_tag(index_or_tag, value) if index_or_tag.is_a? String
  @elements[index].value = value
  @elements[index]
end
each(&block) click to toggle source
# File lib/grizzly_ber.rb, line 153
def each &block
  @elements.each &block
end
from_ber(byte_array) click to toggle source
# File lib/grizzly_ber.rb, line 121
def from_ber(byte_array)
  raise ArgumentError, "byte_array must be an array of bytes" unless byte_array.is_a? Array and byte_array.all? {|byte| byte.is_a? Integer and byte <= 0xFF}
  while byte_array.any?
    byte_array.shift while byte_array.any? && is_erasure_byte(byte_array[0])
    break if byte_array.empty?
    element = GrizzlyBerElement.new(byte_array)
    raise ParsingError if element.tag.nil? or element.value.nil?
    @elements << element
  end
  raise ParsingError if byte_array.any?
  self
end
from_ber_hex_string(hex_string) click to toggle source
# File lib/grizzly_ber.rb, line 116
def from_ber_hex_string(hex_string)
  raise ArgumentError, "hex_string must be a valid hex string" unless hex_string.is_a? String and hex_string.size.even? and hex_string =~ /^[0-9A-F]*$/
  self.from_ber [hex_string].pack("H*").unpack("C*")
end
hex_value_of_first_element_with_tag(tag) click to toggle source
# File lib/grizzly_ber.rb, line 163
def hex_value_of_first_element_with_tag(tag)
  first_tagged_element = value_of_first_element_with_tag(tag)
  first_tagged_element &&= first_tagged_element.pack("C*").unpack("H*").first.upcase
end
remove!(tag) click to toggle source
# File lib/grizzly_ber.rb, line 184
def remove!(tag)
  @elements = @elements.select {|element| element.tag != tag.upcase}
  self
end
set_hex_value_for_tag(tag, value) click to toggle source
# File lib/grizzly_ber.rb, line 180
def set_hex_value_for_tag(tag, value)
  set_value_for_tag(tag, [value].pack("H*").unpack("C*"))
end
set_value_for_tag(tag, value) click to toggle source
# File lib/grizzly_ber.rb, line 168
def set_value_for_tag(tag, value)
  real_tag = GrizzlyTag.named(tag) ? GrizzlyTag.named(tag)[:tag] : tag.upcase
  first_tagged_element = @elements.find {|element| real_tag == element.tag}
  if first_tagged_element.nil?
    first_tagged_element = GrizzlyBerElement.new
    first_tagged_element.tag = real_tag
    @elements << first_tagged_element
  end
  first_tagged_element.value = value
  first_tagged_element
end
size() click to toggle source
# File lib/grizzly_ber.rb, line 149
def size
  @elements.size
end
to_ber() click to toggle source
# File lib/grizzly_ber.rb, line 134
def to_ber
  @elements.reduce("") {|ber_array, element| ber_array += element.to_ber}
end
to_s(indent_size: 0) click to toggle source
# File lib/grizzly_ber.rb, line 189
def to_s(indent_size: 0)
  indent = " " * 3 * indent_size
  @elements.reduce("") do |output, element| 
    info = GrizzlyTag.tagged(element.tag) || {:name => "Unknown Tag", :description => "Unknown"}
    output += "#{indent}#{element.tag}: #{info[:name]}\n"
    output += "#{indent} Description: #{info[:description]}\n"
    if element.value.is_a? GrizzlyBer
      output += element.value.to_s(indent_size: indent_size+1)
    else
      output += "#{indent} Value: #{element.value.pack("C*").unpack("H*").first}"
      if info[:format] == :string
        string_value = ", \"#{element.value.pack("C*")}\""
        output += string_value if string_value.encoding == output.encoding #output is expected to be Encoding::UTF_8 but that default mustn't be forced here.
      end
      output += "\n"
    end
  end
end
value_of_first_element_with_tag(tag) click to toggle source
# File lib/grizzly_ber.rb, line 157
def value_of_first_element_with_tag(tag)
  first_tagged_element = @elements.find {|element| tag.upcase == element.tag}
  first_tagged_element ||= @elements.find {|element| element.tag == GrizzlyTag.named(tag)[:tag]} if GrizzlyTag.named(tag)
  first_tagged_element &&= first_tagged_element.value
end

Private Instance Methods

is_erasure_byte(byte) click to toggle source
# File lib/grizzly_ber.rb, line 210
def is_erasure_byte(byte)
  byte == 0x00 || (!@allow_FF_tags && byte == 0xFF)
end