def read_binary_object(fname,fd)
      # first: read the marker byte
      buff = fd.read(1)

      object_length = buff.unpack("C*")
      object_length = object_length[0] & 0xF

      buff = buff.unpack("H*")
      object_type = buff[0][0].chr

      if(object_type != "0" && object_length == 15) then
        object_length = read_binary_object(fname,fd)
        object_length = object_length.value
      end

      case object_type
      when '0' # null, false, true, fillbyte
        read_binary_null_type(object_length)
      when '1' # integer
        read_binary_int(fname,fd,object_length)
      when '2' # real
        read_binary_real(fname,fd,object_length)
      when '3' # date
        read_binary_date(fname,fd,object_length)
      when '4' # data
        read_binary_data(fname,fd,object_length)
      when '5' # byte string, usually utf8 encoded
        read_binary_string(fname,fd,object_length)
      when '6' # unicode string (utf16be)
        read_binary_unicode_string(fname,fd,object_length)
      when '8'
        CFUid.new(read_binary_int(fname, fd, object_length).value)
      when 'a' # array
        read_binary_array(fname,fd,object_length)
      when 'd' # dictionary
        read_binary_dict(fname,fd,object_length)
      end
    end
def read_binary_object(fname,fd)
      # first: read the marker byte
      buff = fd.read(1)

      object_length = buff.unpack("C*")
      object_length = object_length[0] & 0xF

      buff = buff.unpack("H*")
      object_type = buff[0][0].chr

      if(object_type != "0" && object_length == 15) then
        object_length = read_binary_object(fname,fd)
        object_length = object_length.value
      end

      case object_type
      when '0' # null, false, true, fillbyte
        read_binary_null_type(object_length)
      when '1' # integer
        read_binary_int(fname,fd,object_length)
      when '2' # real
        read_binary_real(fname,fd,object_length)
      when '3' # date
        read_binary_date(fname,fd,object_length)
      when '4' # data
        read_binary_data(fname,fd,object_length)
      when '5' # byte string, usually utf8 encoded
        read_binary_string(fname,fd,object_length)
      when '6' # unicode string (utf16be)
        read_binary_unicode_string(fname,fd,object_length)
      when '8'
        CFUid.new(read_binary_int(fname, fd, object_length).value)
      when 'a' # array
        read_binary_array(fname,fd,object_length)
      when 'd' # dictionary
        read_binary_dict(fname,fd,object_length)
      end
    end
def read_binary_object ( fname , fd ) # first: read the marker byte buff = fd . read ( 1 ) object_length = buff . unpack ( "C*" ) object_length = object_length [ 0 ] & 0xF buff = buff . unpack ( "H*" ) object_type = buff [ 0 ] [ 0 ] . chr if ( object_type != "0" && object_length == 15 ) then object_length = read_binary_object ( fname , fd ) object_length = object_length . value end case object_type when '0' # null, false, true, fillbyte read_binary_null_type ( object_length ) when '1' # integer read_binary_int ( fname , fd , object_length ) when '2' # real read_binary_real ( fname , fd , object_length ) when '3' # date read_binary_date ( fname , fd , object_length ) when '4' # data read_binary_data ( fname , fd , object_length ) when '5' # byte string, usually utf8 encoded read_binary_string ( fname , fd , object_length ) when '6' # unicode string (utf16be) read_binary_unicode_string ( fname , fd , object_length ) when '8' CFUid . new ( read_binary_int ( fname , fd , object_length ) . value ) when 'a' # array read_binary_array ( fname , fd , object_length ) when 'd' # dictionary read_binary_dict ( fname , fd , object_length ) end end
Read an object type byte, decode it and delegate to the correct
 reader function
Read an object type byte decode it and delegate to the correct reader function