function StreamToString(mStream: TStream): string;
{ 将内存流转换成字符串 }
var
  I: Integer;
begin
  Result := '';
  if not Assigned(mStream) then Exit;
  SetLength(Result, mStream.Size);
  for I := 0 to Pred(mStream.Size) do try
    mStream.Position := I;
    mStream.Read(Result[Succ(I)], 1);
  except
    Result := '';
  end;
end; { StreamToString }function StringToStream(mString: string; mStream: TStream): Boolean;
{ 返回将字符串保存到内存流是否成功 }
var
  I: Integer;
begin
  Result := True;
  try
    mStream.Size := 0;
    mStream.Position := 0;
    for I := 1 to Length(mString) do mStream.Write(mString[I], 1);
  except
    Result := False;
  end;
end; { StringToStream }

解决方案 »

  1.   

    to zswang:
    我的想法和你第一个例子差不多,先把内容装在stream里,然后一个byte一个byte地放在缓冲里。我的代码是这样的:procedure TForm1.Button3Click(Sender: TObject);
    var  
      sm:TMemoryStream;
      buf:pchar;
      i,count:integer;
    begin
      count:=length(memo1.Text );  //字数  //创建一个流,大小为count,装入memo1的内容  
      sm:=TMemoryStream.Create ;
      sm.SetSize(count);
      Memo1.Lines.SaveToStream(sm);
      
      //创建一个缓冲区,大小也为count,写入流的内容
      getmem(buf,count);
      sm.Write(buf^,count);  //一个字节一个字节地对缓冲区进行加密操作(这里简单地就是把每个字节都设 为char(97)),
      for i:=0 to count-1 do
      begin
        buf[i]:=char(97);  //这里加密,现在假设是变成char(97)
      end;
      
      //再把缓冲区的结果内容放回sm流,做为加密后的流
      sm.Seek(0,soFromBeginning);
      sm.Read(buf^,count);  //把结果显示在memo1上,可是不对!
      buf:=nil;
      memo1.Lines.LoadFromStream(sm);
      sm.Clear ;end;上面是我写的代码,有点乱,而且结果不对。缓冲区的每个字节都能按照预定的设好,但是返回到sm流后感觉就不对了。再Load到memo1上就更不对了。这是为什么?
      

  2.   

    mStream.Position := 0; //指针复位 或者用.Seek(soFromBeginning, 0);
      

  3.   

    我这个菜鸟挣扎了大半个下午才弄明白怎么回事,原来zswang说的mstream.position:=0;是要被用到loadfromstream之前的,否则没有东西可load。可笑我为了这一句代码花了那么长时间,不过挺值的,至少自己这次把有关stream的操作过了一遍,收获大大的。谢谢zswang,分数献上!