code: def read_string(self, size):
          
          if size < 0:
              raise errors.DecodeError('Negative size %d' % size)
          s = self._input.read(size)
          if len(s) != size:
              raise errors.DecodeError('String claims to have %d bytes, but read %d' % (size, len(s)))
          self._pos += len(s)  # Only advance by the number of bytes actually read.
          return s
docs: Reads up to 'size' bytes from the stream, stopping early
          only if we reach the end of the stream.  Returns the bytes read
          as a string.