code: def _ReadString(
        self, file_object, file_offset, data_type_map, description):
      
      # pylint: disable=protected-access
      element_data_size = (
          data_type_map._element_data_type_definition.GetByteSize())
      elements_terminator = (
          data_type_map._data_type_definition.elements_terminator)
  
      byte_stream = []
  
      element_data = file_object.read(element_data_size)
      byte_stream.append(element_data)
      while element_data and element_data != elements_terminator:
        element_data = file_object.read(element_data_size)
        byte_stream.append(element_data)
  
      byte_stream = b''.join(byte_stream)
  
      return self._ReadStructureFromByteStream(
          byte_stream, file_offset, data_type_map, description)
docs: Reads a string.
  
      Args:
        file_object (FileIO): file-like object.
        file_offset (int): offset of the data relative from the start of
            the file-like object.
        data_type_map (dtfabric.DataTypeMap): data type map of the string.
        description (str): description of the string.
  
      Returns:
        object: structure values object.
  
      Raises:
        FileFormatError: if the string cannot be read.
        ValueError: if file-like object or date type map are invalid.