indy10 中的 TIdBytes ?(50分)

赛特

Unregistered / Unconfirmed
GUEST, unregistred user!
在indy9里,AData:TStream;在indy10里,AData:TIdBytes;
接收时,TIdBytes怎么转换成TStream类型呢?(其中,AData:TIdBytes 的大小是不一定的,在转换时,可以用Sizeof(AData)来获取大小吗?)
发送时,也只能Send(TIdBytes),该如何转换呢?
我一直用的是indy9,而且也没感觉到不稳定。都说indy10更稳定我才升级的,但是这个过渡太要命了,怎么变化这么大啊!好像目前indy9仍然是主流吧,不然为什么网上的例子或源码都基本是indy9的,indy10的少得很!
 
正好,我也刚转到Indy10,其实大部份都挺好解决的.
至于你说的这个可以直接用send(adata),Send重载了几种方法,其中有一个就是发Stream的,直接用就是了.
接收的话也是一样,有ReadStream方法...
 
你看看TIdBytes的定义就知道了,其实就是array of byte 你把当当成一个字符数组一个字节一个字节读他,当然也可以把他写到一个流里用传统方法读他
所以获得大小肯定不能用sizeof,要用length
如果你以前用的是indy9,现在改用10了,可以这么改:
mStream:=TmemoryStream.Create;
try
mStream.Write(AData[0],length(AData));
{这样就把他写进流了}
...
finally
mStream.free;
end;

另外sendto的时候,如果参数是tidbytes的,你可以考虑转化下,目前我有2个方案
1.你看他的IdGlobal这个单元里,重载了一系列的tobytes方法,你可以用这个直接转化,缺点是只能是单一类型,不支持字符串,而且很难累加
2.我一般用下面的方法,主要是容易和indy9兼容:
var
bytes:tbytes;
begin
...
try
tmpmsm:=tmemorystream.Create;
tmpmsm.Write(...);
{这部分仍然像indy9一样把数据写入流中}
setlength(bytes,tmpmsm.size);
{这里把流数据复制到Tbytes类型就能发出去了}
Move(tmpmsm.memory^,bytes[0],tmpmsm.Size);
ABinding.SendTo(serverip,serverpoint,bytes);
finally
tmpmsm.Free;
end;
...
end;
 
接受答案了.
 
顶部