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