class Scale::Types::Compact
Public Class Methods
decode(scale_bytes)
click to toggle source
# File lib/scale/types.rb, line 119 def self.decode(scale_bytes) puts "BEGIN " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true first_byte = scale_bytes.get_next_bytes(1)[0] first_byte_in_bin = first_byte.to_s(2).rjust(8, "0") mode = first_byte_in_bin[6..7] value = if mode == "00" first_byte >> 2 elsif mode == "01" second_byte = scale_bytes.get_next_bytes(1)[0] [first_byte, second_byte] .reverse .map { |b| b.to_s(16).rjust(2, "0") } .join .to_i(16) >> 2 elsif mode == "10" remaining_bytes = scale_bytes.get_next_bytes(3) ([first_byte] + remaining_bytes) .reverse .map { |b| b.to_s(16).rjust(2, "0") } .join .to_i(16) >> 2 # or like this: # ['02093d00'].pack('H*').unpack('l').first / 4 elsif mode == "11" remaining_length = 4 + (first_byte >> 2) remaining_bytes = scale_bytes.get_next_bytes(remaining_length) remaining_bytes .reverse .map { |b| b.to_s(16).rjust(2, "0") } .join .to_i(16) end puts " END " + self::TYPE_NAME + ": #{scale_bytes}" if Scale::Types.debug == true new(value) end
Public Instance Methods
encode()
click to toggle source
# File lib/scale/types.rb, line 158 def encode if (value >= 0) && (value <= 63) (value << 2).to_s(16).rjust(2, "0") elsif (value > 63) && (value <= (2**14 - 1)) ((value << 2) + 1).to_s(16).rjust(4, "0").scan(/.{2}/).reverse.join elsif (value > (2**14 - 1)) && (value <= (2**30 - 1)) ((value << 2) + 2).to_s(16).rjust(8, "0").scan(/.{2}/).reverse.join elsif value > (2**30 - 1) value_in_hex = value.to_s(16) length = if value_in_hex.length % 2 == 1 value_in_hex.length + 1 else value_in_hex.length end hex = value_in_hex.rjust(length, "0").scan(/.{2}/).reverse.join (((length/2 - 4) << 2) + 3).to_s(16).rjust(2, "0") + hex end end