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