Du könntest statt des
array of String eine
TStringList benützen. Dann könntest du die Liste per
Text-property serialisieren.
Hier aber trotzdem noch die zwei Funktionen zur Konvertierung von
array of String zu
String und umgekehrt. Sorry, wurde leider etwas lang... Mir ist bewusst, dass jetzt einige denken, dass es besser wäre, einen
TMemoryStream zurückzugeben (statt einen
String). Aber du wolltest es ja mit
Strings (bzw. du "musst" es so haben)
Das ganze sollte auch für Binärdaten funktionieren.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| type TStringArray = array of AnsiString;
function serialize(const Arr: array of AnsiString): AnsiString; const Ind = SizeOf(Integer); var i: Integer; L: Integer; P: PByte; begin L := 0; for i := low(Arr) to high(Arr) do inc(L, Length(Arr[i])); SetLength(Result, L+(Length(Arr)+1)*Ind); P := Pointer(Result); L := Length(Arr); Move(L, P^, Ind); inc(P, Ind); for i := low(Arr) to high(Arr) do begin L := Length(Arr[i]); Move(L, P^, Ind); inc(P, Ind); if L > 0 then begin Move(Pointer(Arr[i])^, P^, L); inc(P, L); end; end; end;
function unserialize(const S: AnsiString): TStringArray; const Ind = SizeOf(Integer); var P: PByte; L, i, Size: Integer; begin try if length(S) < Ind then Abort; P := Pointer(S); Size := Length(S)-Ind; L := PInteger(P)^; inc(P, Ind); if L < 0 then Abort; SetLength(Result, L); for i := 0 to Length(Result)-1 do begin dec(Size, Ind); if Size < 0 then Abort; L := PInteger(P)^; inc(P, Ind); dec(Size, L); if (L < 0) or (Size < 0) then Abort; SetLength(Result[i], L); if L > 0 then begin Move(P^, Pointer(Result[i])^, L); inc(P, L); end; end; if Size <> 0 then Abort; except on EAbort do raise Exception.Create('Fehler beim Decodieren.') else raise; end; end; |