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