我通过字节偏移读取接收到udp报ServRecBuff,数据结构为
ServRecBuff= record
    msgtype : byte
    raceType : byte
    msgcontent array[0..299] of char
end;
其中,msgcontent 对应数据结构struct1(msgtype=1时),struct2(msgtype=2时)
struct1=record
       name: array[0..3]of char;
       url:array[0..200]of char;
end;
struct2=record
      name:array[0..3] of char;
      email:array[0..499]of char;
      pwd;array[0..31]of char;
end;
我想把接受到的报ServRecBuff1保存到listview中,然后再通过双击把数据取出来,如果不保存数据直接读,显示结果是正确的,保存以后再读便出错,奇怪!请大侠帮忙!
代码如下:
procedure TForm1.IdUdpServerRead(Sender:TObject;Adata:TStream:ABinding:TIdSocketHandle);
var
   ServRecBuff1:ServRecBuff;
   ms:TMemoryStream;
   size,ret,i:integer;
begin
   size:=Adata.size;
   ZeroMemory(@ServRecvBuff1,sizeof(ServRecvBuff1));
   ms:=TMemoryStream.Create;
   AData.Seek(0,soFromBeginning);
   ms.Seek(0,soFromBeginning);
   ms.ReadBuffer(ServRecvBuff1,size);//这样可以读取ServRecBuff1的数据   ...............
   
end;
 请问如何定义ms2:TMemoryStream;
可以在此程序中通过servRecvBuff1,读出struct1和struct2的结构中的数据,并用变量保存下来?
比如 ms2.readBuff(struct1,sizeof (struct1));

解决方案 »

  1.   

    试试:   ms2.ReadBuffer(pChar(integer(@ServRecBuff1)+sizeof(byte)*2)^,sizeof(struct1));   ms2.ReadBuffer(pChar(integer(@ServRecBuff1)+sizeof(byte)*2)^,sizeof(struct2));
      

  2.   

    //try一下:
    type MsgHead=record
        MsgType:string[10];
    end
    ...............UdpRead:
     Adata.ReadBuffer(_MsgHead,SizeOf(MsgHead));
    if _MsgHead.MsgType='struct1' then
       Adata.ReadBuffer(_struct1Data,SizeOf(Struct1Data);
    else if _MsgHead.MsgType='struct2'  then
      Adata.ReadBuffer(_struct2Data,SizeOf(Struct2Data);
      

  3.   

    to phoenixsharp(小星星) :
      大侠,消息结构是发送方用c语言构造好的,我只能接收并解析,所以不可能先接收消息头再接收消息体。如何根据同一条消息内的消息类型来解析该消息的消息体,请大侠给于详细指点。