module Net::BER::Extensions::Fixnum

Ber extensions to the Fixnum class.

Public Instance Methods

to_ber() click to toggle source

Converts the fixnum to BER format.

# File lib/net/ber/core_ext/fixnum.rb, line 6
def to_ber
  "\002#{to_ber_internal}"
end
to_ber_application(tag) click to toggle source

Generate a BER-encoding for an application-defined INTEGER. Examples of such integers are SNMP's Counter, Gauge, and TimeTick types.

# File lib/net/ber/core_ext/fixnum.rb, line 30
def to_ber_application(tag)
  [0x40 + tag].pack("C") + to_ber_internal
end
to_ber_enumerated() click to toggle source

Converts the fixnum to BER enumerated format.

# File lib/net/ber/core_ext/fixnum.rb, line 12
def to_ber_enumerated
  "\012#{to_ber_internal}"
end
to_ber_length_encoding() click to toggle source

Converts the fixnum to BER length encodining format.

# File lib/net/ber/core_ext/fixnum.rb, line 18
def to_ber_length_encoding
  if self <= 127
    [self].pack('C')
  else
    i = [self].pack('N').sub(/^[\0]+/,"")
    [0x80 + i.length].pack('C') + i
  end
end

Private Instance Methods

to_ber_internal() click to toggle source

Used to BER-encode the length and content bytes of a Fixnum. Callers must prepend the tag byte for the contained value.

# File lib/net/ber/core_ext/fixnum.rb, line 37
def to_ber_internal
  # CAUTION: Bit twiddling ahead. You might want to shield your eyes or
  # something.

  # Looks for the first byte in the fixnum that is not all zeroes. It does
  # this by masking one byte after another, checking the result for bits
  # that are left on.
  size = Net::BER::MAX_FIXNUM_SIZE
  while size > 1
    break if (self & (0xff << (size - 1) * 8)) > 0
    size -= 1
  end

  # Store the size of the fixnum in the result
  result = [size]

  # Appends bytes to result, starting with higher orders first. Extraction
  # of bytes is done by right shifting the original fixnum by an amount
  # and then masking that with 0xff.
  while size > 0
    # right shift size - 1 bytes, mask with 0xff
    result << ((self >> ((size - 1) * 8)) & 0xff)
    size -= 1
  end

  result.pack('C*')
end