ZLib: Nach Kompression ist immer alles Größer
-
Wenn es um Zahlenfolgen geht, wäre es doch interessant die Daten binär zu transportieren und nicht als String.
-
Schön wärs, mittlerweile sind eine Stunde der Frustration vorbei und ich bin immer noch nicht auf einen brauchbaren Sourcecode gestoßen. Scheinbar gefällt es den Leuten, einfache Dinge möglichst komplex zu gestalten ^^
Ich suche eigentlich lediglich einen Sourcecode bestehend aus 2 Dateien. huffmann.c, huffmann.h und 2 Funktionen: encode, decode und gefunden habe ich 3 Beispiele. 2 die nicht funktionierten und eins mit Klassen und ich habe absolut keinen Plan von Klassen...
Aber vl. wisst ihr wie ich die Funktionen dieser Klasse aufrufe:
class Huffman { public: Huffman(){}; //Huffman(const Huffman& huffman); //~Huffman(); // Operators //const Huffman& operator=(const Huffman& huffman); // Operations void encode(unsigned char *dest, int &csize, unsigned char *sour, int usize); void decode(unsigned char *dest, int &usize, unsigned char *sour); // Access // Inquiry inline int get_uncompressed_size(unsigned char *sour); protected: ...
Ich habs mit Huffman::encode und nur mit encode versucht. Jetzt gehen mir die Ideen aus.
Wie ruft man die denn wirklich auf?Thanks!
-
Da ich keine Ahnung habe welche Kenntnisse du mit C++ schon hast, habe ich mal foglendes Beispiel geschrieben:
#include "huffman.h" int main () { // Die größe ist natürlich abhängig davon was du machen möchtest unsigned char klarText[1024]; unsigned char komprimiert[1024]; strcpy(klarText,"Das ist ein Teststring!"); // Eine Instanz der Klasse Huffman erstellen Huffman crypt; // Jetzt rufen wir die Methode encode() der Instanz crypt auf crypt.encode(klarText, strlen(klarText), komprimiert, /*Ich habe kein Plan vofür usize da ist*/); //Jetzt müsstest du in komprimiert den Verschlüsselten Text drinnen haben //um das ganze wieder zu entschlüsseln rufst du decode() der Instanz crypt auf crypt.decode(komprimiert, /* Hier kommt anscheinend der gleiche Wert wie beim Komprimieren rein*/, klarText); }
Sorry wenn das nicht 1:1 stimmt, aber mit den Standard-Bibliotheken von C++ habe ich noch nicht so viel gearbeiten (bisher CLI/Qt) und C++ bietet ja eigentlich auch std::string an, das man den char's vorziehen sollte (natürlich gibt es ausnahmen).
Hoffe dir damit etwas weitergeholfen zu haben.
Gruß
Rudi G
-
Ok die implementierung hab ich jetzt. Aber ich schätze mal, dass auch dieser Source funktions untüchtig ist. Mein String wird von einer Länge 24 auf eine Länge 85 geändert ^^
Ich habe jetzt fast 3 Stunden rumgesucht und konnte leider nichts brauchbares finden...
Hat von euch jemand etwas parat? Würde mich wirklich freuen
-
C_Cheaf schrieb:
Mein String wird von einer Länge 24 auf eine Länge 85 geändert
übertrage doch die zahlen binär, nicht als strings, wie rüdi schon vorgeschlagen hat. wieso willst du überhaupt 24 bytes komprimieren? ist das nicht schon kurz genug?
-
~fricky schrieb:
wieso willst du überhaupt 24 bytes komprimieren? ist das nicht schon kurz genug?
berechtigte frage. je nach dem wie diese nanohäufchen dann "versendet" werden, frisst der protokoll-overhead den gewinn (sofern überhaupt vorhanden) wahrscheinlich mehr als auf.
-
Das mit den Binär senden habe ich vor. Aber mein Problem ist, dass mir hier ein wenig C++ wissen fehlt. Aber egal, dazu werde ich dann in C++ nen eigenen Thread aufmachen.
So groß ist ein Paket, aber wenn mehrere solche Pakete gesendet werden kommt insgesamt auch schon eine beträchtliche Datenmenge zusammen. Und um diese zu reduzieren, möchte ich jedes Paket komprimieren. Außerdem gibt es auch Pakete die weit größer sind.
EDIT: Sorry hab einen Beitrag übersehen. Die Frage ist nur, ist es besser Daten zu Stauen und als große Haufen zu schicken (Träge!) oder doch lieber kleine häufchen zu schicken.
-
C_Cheaf schrieb:
Die Frage ist nur, ist es besser Daten zu Stauen und als große Haufen zu schicken (Träge!) oder doch lieber kleine häufchen zu schicken.
hängt von der anwendung ab. wie verschickst du sie denn? es wird eine ideale größe für deinen anwendungsbereich geben, die wohl einen kompromiss zwischen datendurchsatz, übertragungsqualität und latenzzeit darstellen wird.
als minimalziel solltest du anstreben, dass deine pakete mehr nutzdaten enthalten als protokoll-overhead. bei nur 24 bytes großen häufchen ist das wahrscheinlich eher nicht der fall.
-
Ok, das Problem ist nur, dass ich hier eine Netzwerklösung für eine Gameengine programmiere. Es gibt Funktionen z.B. enet_send_var() mit der der Wert einer Variable gesendet wird und auf den anderen Rechnern aktualisiert wird.
Leider kann ich nicht wissen, wie mein Enduser die Funktionen nun verwendet.
Am besten wäre wahrscheinlich, wenn man alle Daten die in einem Frame gesendet werden zusammenstaut und diese in einem Paket sendet. Das Problem ist leider, dass sich dadurch die Komplexität meines Projektes wahnsinnig erhöhen wird.
Aber ich sehe ein, dass eine Komprimierung hier wahrscheinlich fehl am Platz ist. Da sollte ich lieber das Grundsystem verbessern.
-
C_Cheaf schrieb:
Aber mein Problem ist, dass mir hier ein wenig C++ wissen fehlt.
C_Cheaf schrieb:
Ok, das Problem ist nur, dass ich hier eine Netzwerklösung für eine Gameengine programmiere.
man sollte gehen lernen, bevor man versucht zu rennen.
-
Ich sagte ich kann nicht C++ d.h. ich kann keine objektorientierte Programmierung. Die habe ich auch bis jetzt noch nicht benötigt
Außerdem lerne ich am besten, indem ich praktisch damit arbeite. Theoretisches Zeug wäre zwar wichtig (ich nehme es mir auch gezielt für dieses Jahr vor) aber momentan hab ich zu wenig Zeit dazu. Ich möchte erstmal mein Projekt vollenden.