class HexFile::Record

Constants

DATA
END_OF_FILE
EXTENDED_LINEAR_ADDRESS
EXTENDED_SEGMENT_ADDRESS
START_LINEAR_ADDRESS
START_SEGMENT_ADDRESS

Attributes

address[R]
byte_count[R]
checksum[R]
data[R]
type[R]

Public Class Methods

new(record_ascii) click to toggle source
# File lib/hex_file/record.rb, line 19
def initialize(record_ascii)
  fail HexFile::InvalidRecord, 'Missing start code' unless record_ascii.start_with?(':')
  @byte_count = record_ascii[1..2]
  @address = record_ascii[3..6]
  @type = record_ascii[7..8]
  @data = record_ascii[9..-3]
  @checksum = record_ascii[-2..-1]
end

Public Instance Methods

calculate_checksum(record_content = content) click to toggle source
# File lib/hex_file/record.rb, line 64
def calculate_checksum record_content = content
  256 - (record_content
             .scan(/../)
             .map { |x| x.to_i(16) }
             .reduce(:+)
  ) & 0xFF
end
content() click to toggle source
# File lib/hex_file/record.rb, line 32
def content
  "#{@byte_count}#{@address}#{@type}#{@data}"
end
data_size() click to toggle source
# File lib/hex_file/record.rb, line 55
def data_size
  @byte_count.to_i(16)
end
ok?() click to toggle source
# File lib/hex_file/record.rb, line 59
def ok?
  @checksum.to_i(16) == calculate_checksum
end
raw() click to toggle source
# File lib/hex_file/record.rb, line 28
def raw
  ":#{content}#{@checksum}"
end
set_data(data) click to toggle source
# File lib/hex_file/record.rb, line 44
def set_data data
  data = data.unpack('C*') if data.is_a? String # Assume binary string
  hexdata = data.map{ |d| "%02X" % d }.join
  
  set_hex_data hexdata
end
set_hex_data(data) click to toggle source
# File lib/hex_file/record.rb, line 36
def set_hex_data data
  raise InvalidLength, "Data should be of length #{data_size}!" unless data.length == @data.length

  @data = data
  update_checksum
  self
end
update_checksum() click to toggle source
# File lib/hex_file/record.rb, line 51
def update_checksum
  @checksum = "%02X" % calculate_checksum
end