class ISO8583::BCDField

Attributes

byte_length[RW]
data_length[RW]

Public Instance Methods

encode(value) click to toggle source
# File lib/iso8583/field.rb, line 105
def encode(value)
  begin
    encoded_value = codec.encode(value)
    @data_length = value.size
    @byte_length = encoded_value.bytes.size
  rescue ISO8583Exception => e
    ContextLog.exception(e, e.backtrace, "#{e.message} (#{name})") if Object.const_defined?(:ContextLog)
    raise ISO8583Exception.new(e.message+" (#{name})")
  end

  if padding
    if padding.arity == 1
      encoded_value = padding.call(encoded_value)
    elsif padding.arity == 2
      encoded_value = padding.call(encoded_value, length)
    end
  end

  len_str = case length
            when Integer
              raise ISO8583Exception.new("Too long: #{value} (#{name})! length=#{length}")  if encoded_value.length > length
              raise ISO8583Exception.new("Too short: #{value} (#{name})! length=#{length}") if encoded_value.length < length
              String.new("", encoding: 'ASCII-8BIT')
            when Field
              raise ISO8583Exception.new("Max length exceeded: #{value}, max: #{max}") if max && @byte_length > max
              length.encode(@data_length)
            else
              raise ISO8583Exception.new("Invalid length (#{length}) for '#{name}' field")
            end

  len_str + encoded_value

end
length() click to toggle source

This corrects the length for BCD fields, as their encoded length is half (+ parity) of the content length. E.g. 123 (length = 3) encodes to “x01x23” (length 2)

# File lib/iso8583/field.rb, line 92
def length
  if @length.respond_to?(:odd?)
    @data_length = @length
    if @data_length.odd?
      @byte_length = (@data_length + 1) / 2
    else
      @byte_length = @data_length / 2
    end
    return @byte_length
  end
  @length
end