Autor Beitrag
noctua
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 01:59 
in PHP gibt es eine funktion die nennt sich
ausblenden Quelltext
1:
unserialize( base64_decode( $DasArray ) );					


ich habe ein array und muss das in einen string und wieder zurück wandeln können. Hat Delphi sowas auch?

_________________
Am ende sterben eh alle ................
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: So 01.05.05 08:00 
user profile iconnoctua hat folgendes geschrieben:
ich habe ein array und muss das in einen string und wieder zurück wandeln können. Hat Delphi sowas auch?

Kommt drauf an, was für ein Array es ist.

_________________
Ciao, Sprint.
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 12:06 
was für eins?

hmm.... ein 1D-string-array

_________________
Am ende sterben eh alle ................
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 12:47 
n beispiel:

ausblenden Delphi-Quelltext
1:
var DasArray: array[1...10of string = ('hallo','blabla'....);					


sowas müsste ich in einen string packen können und dann aber auch wieder aus dem string ein array machen können.

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.

_________________
Am ende sterben eh alle ................
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 01.05.05 13:57 
Ganz einfach:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
    X: Integer;
Begin
    Result := '';
    For X := Low(Arr) TO High(Arr) do
        Result := Result + Arr[X] + '-';    
end;


Das Unserialize würde dann an den Bindestrichen einfach den String aufspalten. Ohne Encodierung der Ausgangsstrings dürfen diese keine Bindestriche enthalten, ansonsten musst Du diese vorher codieren (z.B. mit MIME Base 64 oder Hex)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 01.05.05 17:14 
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.

ausblenden volle Höhe Delphi-Quelltext
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); // 4
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); // 4
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 < 0or (Size < 0then
    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;
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 18:36 
ich blick bei deinen functionen nicht ganz durch, aber wenn ich sie testen will kommt als ergebiniss immer ein ' , bei serialize und ein  bei unserialize


das is etwas verwirrend.

_________________
Am ende sterben eh alle ................
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 01.05.05 20:35 
Die serialisierten Daten kannst du nicht anzeigen lassen. Wieso auch? Ich dachte, dass du vielleicht einfach die Daten in eine Datei speichern möchtest.
Wofür brauchst du das ganze eigentlich?
noctua Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 170



BeitragVerfasst: So 01.05.05 22:03 
k hab mir jetzt ne eingene serialize funktion gebastelt, funktioniert auch wunderbar


ich brauche sie um dort einige info-daten der planeten (es soll ja ein spiel werden) zu speichern.

_________________
Am ende sterben eh alle ................