我想定义一个变长结构。
TTest = record
  NameLen:Integer;
  Name:Pchar;  //这个的长度是根据NameLen而来。
end;
我想将这个结构写入到一个TMemoryStream中,请问如何做呢????

解决方案 »

  1.   

    var
        t:TTest;
        m:TMemoryStream;
    begin
        m:=TMemoryStream.Create;
        t.NameLen:=10;
        GetMem(t.Name,10);
        CopyMemory(t.Name,pChar('hahahahaha'),10);
        m.Write(t.Name^,10);
      

  2.   

    建议你把结构改一下
    TTest = record 
      NameLen:Integer; 
      NameLen:Integer;//加上这个,代表Name的长度
      Name:Pchar;  //这个的长度是根据NameLen而来。 
    end;读取时,根据NameLen读取Name的长度
      

  3.   


    搞错了,你已经 有Namelen了,那就根据这个长度来定位stream中name的位置
      

  4.   

    0x( 04 00 00 00 30 31 32 33 )
    类似如上
    04 00 00 00为一个integer
    30 31 32 33为内容,0123那么定义时,使用:
    len: Integer;
    data: array [0..maxsize] of char;如果你了解明白,那么可以研究一下这样的使用:
    len: Integer;
    data: array [0..0] of char;如果你了解明白上面的,再研究一下:
    buffer: array [0..maxsize] of char;
    P: PTest;
    P := Buffer;
    P.len := ...
    p.data....or
    PInteger(@Buffer)^ := ...
    StrPLCopy((Buffer + SizeOf(Integer))^, SrcString, maxsize);方法N多
      

  5.   

    to hongqi162 :我了解正常情况是你说的那样定义,现在我要的就是不正常的情况。可以说必须用我说的那个方式定义。我想了解的是如何将这个结构写入到一个流中,因为用sizeof来求这个结构的大小是不正确的了。不知道有没有好的建议?
      

  6.   


    既然有 NameLen来记录长度,那还需要sizeof什么的做什么?
      

  7.   

    写入流中很简单
    var
      test:TTest;
    begin
    下面是分开写入过程
      Stream.WriteBuffer(test.NameLen,SizeOf(Integer));
      Stream.WriteBuffer(test.Name,test.NameLen);
    end;读取
    var
      p:Pchar;
    begin
      p := Stream.Memory;
      Move(p^,test.NameLen,SizeOf(integer));
      Inc(p,SizeOf(Integer);
      Move(p^,test.Name,test.NameLen);
    end;
      

  8.   

    to bdmh :只能用分开写入的方法吗??
      

  9.   


    只能分开 。
    TTest这个结构中,存了NameLen和Name指针,是2个integer的长度 ,而Name^的地方是不定的,和NameLen不再连续的内存中,只能分开写入。