一个关于Tmemorystream.write的问题(100分)

  • 主题发起人 主题发起人 yongxuefeng
  • 开始时间 开始时间
Y

yongxuefeng

Unregistered / Unconfirmed
GUEST, unregistred user!
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.RemoteHost := Edit1.Text;
NMUDP1.RemotePort := StrToInt(Edit2.Text);
TmpStr := Edit3.Text;
MyStream := TMemoryStream.Create;
try
MyStream.Write(Tmpstr[1], Length(Edit3.Text));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;

以上是在编写Delphi里的udp程序是经常要用到的代码。请问问什么用:
mystream.write(tmpstr[1],length(edit3.text));
而不用:
mystream.write(tmpstr,length(edit3.text));
好象用
mystream.write(Pchar(tmpstr)^,length(edit3.text));
也行,请问问什么?有什么特别的要注意的吗?到底tmemorystream.write和read在底层
是怎么读和写的? 详细点!谢谢!
 
在底层就是system.move,参数是要指针的头地址。如

P1: Pointer ==> P1^
P2: PChar; ==> P2^
S: string; ==> S[1], PChar(S)^, //字符串的第一个地址是1,不是0
C: array [0..100] of char; ==>@C[0]

TMemoryStream的read, write操作其实就是对Memory的Move操作进行封装
move(var Source; var Dest; count: Integer);
 
用一个最简单的办法你可以分别执行
mystream.write(tmpstr[1],length(edit3.text));
mystream.write(tmpstr,length(edit3.text));
mystream.savetofile('test.bin');
然后用UltraEdit打开TEST.BIN看看就知道差别的不同了!
如果用前者如果TMSTR='ABC'那么实际写到MYSTREAM的是'ABC'
如果用后者那么就变成了#3+'AB'因为STRING的一个个字节是
字符串的长度!如果你打算用将整个STRING类型都写进去就需要用
mystream.write(tmpstr,length(edit3.text)+1);


 
后退
顶部