1509aa8ef6
Some code has been removed. Version control is not synonymous with code storage - if you're not using it now, you probably don't have working tests and the code will be buggy anyway. Write it when you need it.
64 lines
1.4 KiB
Ruby
64 lines
1.4 KiB
Ruby
module Net
|
|
class LDAP
|
|
module Extensions
|
|
module Fixnum
|
|
#
|
|
# to_ber
|
|
#
|
|
def to_ber
|
|
"\002" + to_ber_internal
|
|
end
|
|
|
|
#
|
|
# to_ber_enumerated
|
|
#
|
|
def to_ber_enumerated
|
|
"\012" + to_ber_internal
|
|
end
|
|
|
|
#
|
|
# to_ber_length_encoding
|
|
#
|
|
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
|
|
|
|
# Generate a BER-encoding for an application-defined INTEGER.
|
|
# Example: SNMP's Counter, Gauge, and TimeTick types.
|
|
#
|
|
def to_ber_application tag
|
|
[0x40 + tag].pack("C") + to_ber_internal
|
|
end
|
|
|
|
#--
|
|
# Called internally to BER-encode the length and content bytes of a Fixnum.
|
|
# The caller will prepend the tag byte.
|
|
MAX_SIZE = 0.size
|
|
def to_ber_internal
|
|
size = MAX_SIZE
|
|
while size>1
|
|
break if (self & (0xff << (size-1)*8)) > 0
|
|
size -= 1
|
|
end
|
|
|
|
result = [size]
|
|
|
|
while size>0
|
|
# right shift size-1 bytes, mask with 0xff
|
|
result << ((self >> ((size-1)*8)) & 0xff)
|
|
|
|
size -= 1
|
|
end
|
|
|
|
result.pack('C*')
|
|
end
|
|
private :to_ber_internal
|
|
end
|
|
end
|
|
end
|
|
end |