我想定义一个变长结构。
TTest = record
NameLen:Integer;
Name:Pchar; //这个的长度是根据NameLen而来。
end;
我想将这个结构写入到一个TMemoryStream中,请问如何做呢????
TTest = record
NameLen:Integer;
Name:Pchar; //这个的长度是根据NameLen而来。
end;
我想将这个结构写入到一个TMemoryStream中,请问如何做呢????
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);
TTest = record
NameLen:Integer;
NameLen:Integer;//加上这个,代表Name的长度
Name:Pchar; //这个的长度是根据NameLen而来。
end;读取时,根据NameLen读取Name的长度
搞错了,你已经 有Namelen了,那就根据这个长度来定位stream中name的位置
类似如上
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多
既然有 NameLen来记录长度,那还需要sizeof什么的做什么?
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;
只能分开 。
TTest这个结构中,存了NameLen和Name指针,是2个integer的长度 ,而Name^的地方是不定的,和NameLen不再连续的内存中,只能分开写入。