首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Tidtcpserver 和 tidtcpClient 控件通信时,数据包的有关问题

2014-01-25 
Tidtcpserver 和 tidtcpClient 控件通信时,数据包的问题两者通信时,用结构体(就是Record类型)作为数据包传

Tidtcpserver 和 tidtcpClient 控件通信时,数据包的问题
两者通信时,用结构体(就是Record类型)作为数据包传递比较方便,但调用ReadBuffer()时,就需要给出这个结构体的Size, 我的问题是:
如果记录类型有一项是String类型,且无法固定长度,我就无法使用SizeOf()去获得结构体的长度。
当然笨办法就是将它定义的比较长,比如string[500]或更长,但终究不妥。 定义大了浪费,小了又怕不够。

请问各位有什么好办法?或者这样的应用需求有什么其他的解决办法?谢谢!
[解决办法]
不过有一点LZ要搞清楚,string类型是一个指针,s:string s 是一个32位指针变量,占4字节。你sizeof(s)就是4,而不是这个字符串的内存占用数。
再一个,要想知道一个字符串的串长度可以 lenght(s), string的内存占用比较复杂,如果是一个非空的string,它还会在负偏移处占用8个字节,前4字节保存引用计数,后4字节保存字串长度。所以在一个非空的string下,pint(integer(s)-4)^这样也等同于 lenght(s)。不管怎么说还不要在结构体中使用string,如果字串长度不大可以用shortstring,长度是256。兼容性最好的是数组,可以用动态数组,在给结构体赋值时再动态决定该数组的长度,也就不会有浪费。pchar也是可以的,在结构体中记得加个成员保存字串长度。
[解决办法]
Record里不能用string,string其实是个指针,里面用byte数组,配合一个size变量来指出数据长度。

热点排行