简单问题(就是搞不定)(50分)

  • 主题发起人 主题发起人 chimney
  • 开始时间 开始时间
C

chimney

Unregistered / Unconfirmed
GUEST, unregistred user!
在每个数据包后添加结束符(回车/#13)
数据包结构:
TPacket=Record
A:Integer;
B:Integer;
C:Integer;
Data:array[0..4096-3*SizeOf(integer)-1] of Char
end

var
Packet:TPacket;
SendSize:integer;
SendBuf:array[0..4095] of Char;
begin
With Packet do
begin
A:=10;
B:=13;
C:=10;
Data:='ABCDEF'+#13;
end;
SendSize:=SizeOf(Integer)*3+7;
Move(Packet,SendBuf,SendSize);
.
.
.
.
end;
SendBuf内容变成了:#10#13#10'A''B''C''D''E''F'#13.....
接收端根据#13的位置判断数据包是否结束就出错了,怎么办?
 
我是个菜鸟 但我总觉得 dato 字段应该定义为string
 
这因为有B:=13
我觉得应该先把前面三个整形给截取
然后根据#13来判断数据包是否结束
或者从sendbuf[12]开始判断
 
SendBuf内容变成了:#10#13#10'A''B''C''D''E''F'#13.....你确定吗?


 
应该是:#10#0#0#0#13#0#0#0#10#0#0#0'A''B''C''D''E''F'#13
整型占4个字节。
总觉得你不应该用#13来做为结束符号。

type
TPacket=Record
len:Integer;//长度
A:Integer;
B:Integer;
C:Integer;
Data:array[0..4096-3*SizeOf(integer)-1] of Char
end ;

var
Packet:TPacket;
SendSize:integer;
SendBuf:array[0..4095] of Char;
begin
With Packet do
begin
A:=10;
B:=13;
C:=10;
Data:='ABCDEF'+#13;
end;
SendSize:=SizeOf(Integer)*4+7;
Packet.len := SendSize; //长度。
Move(Packet,SendBuf,SendSize);

//在报文的头部添加长度字段,接收数据的时候先获得长度。再截取后面的部分。
 
对,sendbuf应该是:#10#0#0#0#13#0#0#0#10#0#0#0'A''B''C''D''E''F'#13
我直接写的。
To Highpeak:
如果不用#13,那用什么比较好呢?看来得在每个包前加包长度了。
 
加长度是最好的方法。
IP包不就这样的吗,呵呵。
 
用一个组合来做结束符如何,如'#13#0#13'
 
不好。也会出现相同的情况。
 
后退
顶部