class CFPropertyList::Binary

def read_binary_object(fname,fd)

reader function
Read an object type byte, decode it and delegate to the correct
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