String zippen
-
Ich kenne diese Komponenten nicht, aber wenn du mit ZipMaster in Delphi Erfolg hattest, warum benutzt du nicht einfach ZipMaster? Du weißt sicher, daß du Delphi-Komponenten problemlos in C++Builder verwenden kannst.
-
@DocShoe: ZipStream ist genu zu dem Zweck da, aber ich hab auch schon versucht das zuerst in einen MemoryStream zurück zu laden, macht leider auch keinen Unterschied.
@audacia: ZipBuilder ist die Portierung von Zipmaster für C++Builder.
-
http://home.scarlet.be/~tsf17400/EZipBuilder.html ZipBuilder homepage:
"TZipBuilder is the CPP translation of the Delphi component TZipMaster"
-
Dann wußte offenbar der Autor dieser Komponente nicht, daß C++Builder auch Delphi kann.
Nochmal: wenn die Delphi-Variante funktioniert, nimm die. Auch in C++Builder.
-
Der ZipMaster (1.90) ist auch aktueller als der ZipBuilder (1.79), wenn ZipBuilder tatsächlich der cpp Port ist. Der ZipBuilder hat zumindest das Problem, dass er keine Dateien einpacken kann, die >4GB sind (falls das irgendwie von Interesse sein sollte).
-
Das Problem liegt wohl zu 99,99% nicht an der Komponente, der Stream enthält ja was.
Hab bissl weiter probiert und eine Möglichkeit gefunden Daten aus dem Stream herauszupressen.
C++ ist hier extrem unhandlich... und etwas frustrierend, aber evtl. gewöhn ich mich ja noch daranfolgendes Stück Code bringt immerhin output
//Edit2->Text = sl->Text; // "" empty string... ms->Clear(); ms->LoadFromStream(ZipBuilder1->ZipStream); ms->Seek(0, soFromBeginning); char dest[256]; strncpy(dest, "", 256); char *ptr; ptr = (char *) memcpy(dest, ms, ms->Size); if (ptr) Edit2->Text = dest; // enthält merkwürdige Zeichen, könnte gezippter Stream sein
hab auch schon versucht den Text vom TEdit ohne Stringliste in den Stream zu bekommen, aber hier stellt sich C++ auch quer
TBytes* Buffer = new TBytes(); TEncoding::Default->GetBytes(Edit1->Text); ms->WriteBuffer(Buffer[0], Buffer->Length); // E2031 Typumwandlung von 'TByteDynArray' nach 'void *' nicht zulässig
-
Hatte die letzten Tage leider kaum Zeit das Problem weiter zu verfolgen.
Bin noch nicht weiter gekommen einen UnicodeString in einen Stream zu packen.
Der Ansatz über TBytes scheint zu stimmen, aber die Konvertierung erwartet leider Datentypen die ich so nicht hab. (wenn man z.B. bei void* von einem DT sprechen kann)
-
Ingo_R schrieb:
C++ ist hier extrem unhandlich... und etwas frustrierend, aber evtl. gewöhn ich mich ja noch daran
[...]
hab auch schon versucht den Text vom TEdit ohne Stringliste in den Stream zu bekommen, aber hier stellt sich C++ auch querWas sich da querstellt, scheinen mir eher deine C++-Kenntnisse zu sein als die Sprache selbst.
Ingo_R schrieb:
//Edit2->Text = sl->Text; // "" empty string... ms->Clear(); ms->LoadFromStream(ZipBuilder1->ZipStream); ms->Seek(0, soFromBeginning); char dest[256]; strncpy(dest, "", 256); char *ptr; ptr = (char *) memcpy(dest, ms, ms->Size); if (ptr) Edit2->Text = dest; // enthält merkwürdige Zeichen, könnte gezippter Stream sein
->
ms->Clear (); ms->LoadFromStream (ZipBuilder1->ZipStream); ms->Seek (0, soFromBeginning); String theString; theString.SetLength (ms->Length / sizeof (Char)); ms->ReadBuffer (theString.c_str (), ms->Length * sizeof (Char));
Ingo_R schrieb:
TBytes* Buffer = new TBytes(); TEncoding::Default->GetBytes(Edit1->Text); ms->WriteBuffer(Buffer[0], Buffer->Length); // E2031 Typumwandlung von 'TByteDynArray' nach 'void *' nicht zulässig
->
ms->Clear (); ms->WriteBuffer (Edit1->Text.c_str (), Edit1->Text.Length () * sizeof (Char));
Alles ungetestet.
Im Übrigen:
char dest[256]; strncpy(dest, "", 256); char *ptr; ptr = (char *) memcpy(dest, ms, ms->Size);
Das ist nicht nur Blödsinn, sondern ein potentieller Pufferüberlauf. Laß die Finger von C-Casts, den str*()- und den mem*()-Funktionen, solange du nicht weißt, was du machst.
-
Erstmal vielen Dank für die Tips und sorry, dass ich nicht mehr reagiert hab, aber musste mich erstmal um was anderes kümmern.
Leider klappt
audacia schrieb:
ms->Clear (); ms->LoadFromStream (ZipBuilder1->ZipStream); ms->Seek (0, soFromBeginning); String theString; theString.SetLength (ms->Length / sizeof (Char)); ms->ReadBuffer (theString.c_str (), ms->Length * sizeof (Char));
nicht, wirft eine Exception EReadError 'Stream-Lesefehler'.
Das XE ja mit UnicodeString arbeitet, hab ich die Datentypen auch mal auf UnicodeString und wchar_t geändert, aber das ist wohl impliziet auch schon so.Das Schreiben in den Stream scheint aber zu funktionieren
audacia schrieb:
ms->Clear (); ms->WriteBuffer (Edit1->Text.c_str (), Edit1->Text.Length () * sizeof (Char));
Alles ungetestet.
audacia schrieb:
Im Übrigen:
char dest[256]; strncpy(dest, "", 256); char *ptr; ptr = (char *) memcpy(dest, ms, ms->Size);
Das ist nicht nur Blödsinn, sondern ein potentieller Pufferüberlauf. Laß die Finger von C-Casts, den str*()- und den mem*()-Funktionen, solange du nicht weißt, was du machst.
Das hatte ich auch nur in einem Forum gefunden und probiert. Da es funktioniert hat hab ich es erstmal behalten.
Das das memcpy die char Variable überfluten kann ist mir klar.Meine C++ Kenntnisse sind auch nur sehr rudimentär, da ich das Theme vor 11-12 Jahren nur mal angeschnitten hab und seither Delphi programmiere. Bin auch durchaus lernfähig, aber aktuelle Literatur ist nicht wirklich auffindbar. Evtl. hast ja in der Richtung noch einen Tip
-
Ingo_R schrieb:
Leider klappt
audacia schrieb:
ms->Clear (); ms->LoadFromStream (ZipBuilder1->ZipStream); ms->Seek (0, soFromBeginning); String theString; theString.SetLength (ms->Length / sizeof (Char)); ms->ReadBuffer (theString.c_str (), ms->Length * sizeof (Char));
nicht, wirft eine Exception EReadError 'Stream-Lesefehler'.
Das kommt davon, wenn man nicht testet
So geht's:ms->Clear (); ms->LoadFromStream (ZipBuilder1->ZipStream); ms->Position = 0; String theString; theString.SetLength (ms->Size / sizeof (Char)); ms->ReadBuffer (theString.c_str (), ms->Size);
Wenn du sonst mit Delphi arbeitest, weißt du ja, daß man für jedes "new TWhatever" (analog "TWhatever.Create") auch ein try-finally-Konstrukt braucht, um sicherzustellen, daß das Objekt in jedem Fall ordnungsgemäß aufgeräumt wird. In C++ gibt es dafür den std::auto_ptr<>, der ungefähr dasselbe tut.
Ingo_R schrieb:
Das XE ja mit UnicodeString arbeitet, hab ich die Datentypen auch mal auf UnicodeString und wchar_t geändert, aber das ist wohl impliziet auch schon so.
Ja. Laß es besser so.
Ingo_R schrieb:
Meine C++ Kenntnisse sind auch nur sehr rudimentär, da ich das Theme vor 11-12 Jahren nur mal angeschnitten hab und seither Delphi programmiere. Bin auch durchaus lernfähig, aber aktuelle Literatur ist nicht wirklich auffindbar. Evtl. hast ja in der Richtung noch einen Tip
Sehr lesenswert ist das Standard-Buch zum C++Builder: http://rkaiser.de/rkaiser/CB2007_Buch/CB2007_Buch.htm