code: def tree_entries_from_data(data):
      
      ord_zero = ord('0')
      space_ord = ord(' ')
      len_data = len(data)
      i = 0
      out = []
      while i < len_data:
          mode = 0
  
          # read mode
          # Some git versions truncate the leading 0, some don't
          # The type will be extracted from the mode later
          while byte_ord(data[i]) != space_ord:
              # move existing mode integer up one level being 3 bits
              # and add the actual ordinal value of the character
              mode = (mode << 3) + (byte_ord(data[i]) - ord_zero)
              i += 1
          # END while reading mode
  
          # byte is space now, skip it
          i += 1
  
          # parse name, it is NULL separated
  
          ns = i
          while byte_ord(data[i]) != 0:
              i += 1
          # END while not reached NULL
  
          # default encoding for strings in git is utf8
          # Only use the respective unicode object if the byte stream was encoded
          name = data[ns:i]
          name = safe_decode(name)
  
          # byte is NULL, get next 20
          i += 1
          sha = data[i:i + 20]
          i = i + 20
          out.append((sha, mode, name))
      # END for each byte in data stream
      return out
docs: Reads the binary representation of a tree and returns tuples of Tree items
      :param data: data block with tree data (as bytes)
      :return: list(tuple(binsha, mode, tree_relative_path), ...)