Ich habe ein Tool für Gothic 3 entwickelt (damals in Eile zusammengehackt):
http://www.bendlins.de/nico/gothic3/ die g3pak-0.0.0.9_src.7z
Der interessante Quellcodeauszug ist:
Delphi-Quellcode:
SrcStrm := TFileStream.Create({SrcFileName}, fmOpenRead or fmShareDenyWrite);
try
SrcStrm.Seek({SrcOffset}, soFromBeginning);
DstStrm := TFileStream.Create({DstFileName}, fmCreate or fmShareDenyWrite);
try
if {SrcSize} <= 0 then
Exit;
if {SrcIsCompressed} then
begin
ZipStrm := TZDecompressionStream.Create(SrcStrm);
try
SrcStrm.Seek({SrcOffset}, soFromBeginning);
DstStrm.CopyFrom(ZipStrm, {SrcSize})
finally
ZipStrm.Free();
end;
end
else
DstStrm.CopyFrom(SrcStrm, {SrcSize});
finally
DstStrm.Free();
end;
finally
SrcStrm.Free();
end;
ps: Man kann für DstStrm natürlich andere Streams verwenden (TMemoryStream, wenn man genug Speicher hat).
Die 'variablen Strukturen' sind nicht ungewöhnlich. Das hängt damit zusammen, dass die Daten sequenziell gelesen/geschrieben werden. Beispiel für eine einfache Persistenz: (string)[size, [data[size]], (integer)[data], ...