Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

textkomprimierung mit javascript





Frage

hi! ich möchte eine größere tabelle ins internet stellen um traffic zu sparen schicke ich die daten in einer js-datei die die html-tabelle dann erst erzeugt ua sind das ca 15kb usernamen jetzt frag ich mich ob man die vielleicht noch komprimieren kann wenn man die vorher als text aneinanderhängt? der algorithmus müßte halt klein sein da er ja auch mitverschickt wird kennt da jemand was?

Antwort 1 von Pumuckel

wenn es statische Daten sind, wäre der Huffman-Code ideal. Dazu ermittelt man erst die Anzahl jedes vorkommenden Zeichens (in dem Fall Buchstaben in der Textdatei) und codiert diese dann mit absteigender Auftrittshäufigkeit mit zunehmender Bitzahl. Die Codierung schreibt man dann in eine Lookup-Tabelle, aus der man die Zeichen dann wieder herstellt.

im Netz findest Du bestimmt eine Menge Infos dazu, evtl. auch Beispiel-Code.



Antwort 2 von robbie17

aber wie soll man die daten dann darstellen?
wenn man die binären daten zb. hexadezimal darstellt
verdoppelt sich die länge des strings wieder
dann bleibt nix mehr übrig was diesen aufwand lohnt

Antwort 3 von Pumuckel

Du wirst wohl oder übel auf Bit-Operationen (shiften, AND, OR etc.) zurückgreifen müssen um Dir die einzelnen Bits in Bytefolgen zusammenzubauen.


Eine simplere Möglichkeit als der Huffman-Code wäre einfach eine Tabelle mit allen Buchstaben drin + einige Sonderzeichen. Wenn Du die Gesamtzeichenzahl unter 33 halten kannst (sollte bei Namen möglich sein), kannst Du die Position des jeweiligen Zeichens in der Tabelle mit 5 Bit kodieren.
Bit-Operationen brauchst Du dazu aber auch.
Der Kompressionsgewinn wäre bei dieser simplen Methode ~37%. Der Vorteil wäre, daß die Dekodierung sehr schnell geht, weil die Codelänge immer gleich ist.


Antwort 4 von robbie17

aber wie sollen die komprimierten daten in den quelltext?
wie kann ich einer javascriptvariblen binärcode zuweisen?
normalerweise würd ichs hexadezimal machen
zb.

var zeichenkette="A0FFC5 ... ";

aber das ist ja zu lang

Antwort 5 von Pumuckel

Du gehst von einer Variable sign mit dem Wert 0 aus:

var sign = 0;
var bit_value;
var temp = 0;

das 1. Bit mit dem Wert bit_value (1 oder 0), welches Deinem Codierbit entspricht, weist Du folgendermaßen zu:

temp = bit_value << 7; //shiften um 7 Stellen nach links
sign = sign | temp; //ODER-Verknüpfung

dann macht man mit dem 2. Bit weiter:

temp = bit_value << 6;
sign = sign | temp;

und so weiter.

Das letzte Bit im Byte weist man folgndermaßen zu:

temp = bit_value;
//oder temp = bit_value << 0
sign = sign | temp;


Danach machst Du einen Type-Cast, um das Byte sign in ein Character umzuwandeln um es abspeichern zu können.

nach jeweils 8 Bit muß das Byte sign wieder auf Null gesetzt werden:
sign = 0;


Das Auslesen läuft im Prinzip genauso:

Auslesen des nächsten Zeichens der Datei in die Variable character

dann erhälst Du das erste Bit mit:

temp = 1 << 7; //ersten Bit im Byte selektieren
bit_value = character & temp; //AND-Verknüpfung

nächstes Bit:
temp = 1 << 6;
bit_value = character & temp;

nach den einzelnen Bitwerten kannst Du dann in der Decodiertabelle suchen (bei Huffman) oder Du packst 5 bit wieder zusammen in ein Byte (die 3 höchsten Bits müssen dann 0 sein) und erhälst eine Zahl zw. 0 und 31, die Dir die Zeile in der Tabelle angibt (Fall aus Antwort 3)


ich bin nicht sehr fit in JScript, aber prinzipiell sollte es so funktionieren. Wegen Java-Script-Details, z.B. Type-Cast musst Du Dir von Anderen helfen lassen oder irgendwo nachlesen.

Antwort 6 von robbie17

danke daß du dir so viel mühe machst
aber ich glaube wir reden total aneinander vorbei
mein problem ist die zwischenspeicherung des komprimierten codes
denn komprimieren tue ich ihn ja bevor er online geht
wie kriege ich ihn dann aber ins web?
der browser soll ein java skript aufrufen und ausführen
dieses soll die daten entpacken
aber die komprimierten daten selbst müssen dafür im skript drin stehen
sonst kann das skript ja nicht auf sie zugreifen
schließlich kann ich mit java script keine datei
auf dem server öffnen und auslesen
die information muß schon im js-quelltext drin stehen
aber wie krieg ich die da platzsparend rein?

Antwort 7 von Pumuckel

ahja ok

am Besten Du schreibst Dir ein kleines Proggi (in C, C++, Basic, Pascal, was auch immer), welches Dir die Namen codiert und die Bytes in eine Datei schreibt. So wie oben erklärt. Du darfst aber eben nur Hexwerte schreiben, keine Sonderzeichen wie Linefeeds etc.

Diese Datei öffnest Du in einem Editor und ziehst den ganzen Text per Drag&Drop in Deinen JScript-Editor. Dort fügst Du ihn als Zeichenfolgenvariable ein:

var string = "blabla-codierte Bytewerte"

zumindest beim IE hat er keine Probleme mit 15kByte-Zeichenfolgen.

Du mußt nur noch herausfinden, wie man diese Stringvariable buchstabenweise ausliest.

P.S. mit PHP wäre das alles einfacher...

Antwort 8 von robbie17

die länge sollte kein problem sein
aber sowohl netscape als auch ie mögen da ein paar zeichen nicht
zb. $00, $0A, $0D und und natürlich das benutzte stringbegrenzungszeichen
entweder " oder '

wie würdest dus denn mit php machen?

Antwort 9 von robbie17

backslash mag wohl auch das sn nicht ..

Antwort 10 von Pumuckel

Mit PHP kann man Textdateien zeichenweise auslesen.
Möglicherweise wäre auch ein Java-Applet überlegenswert, z.B. wenn der Provider kein PHP unterstützt.

Zu den Sonderzeichen:
Unter den einfachen Kompressionsalgorithmen gibt es auch noch den Shannon-Fano-Code. Der ist aber kein Optimalcode. Allerdings wäre es dort einfach(er), diese Sonderzeichen als Codewörter zu vermeiden.


Antwort 11 von robbie17

ob ich php haben werde is noch nich raus
aber wenn ich auf dem server entpacke spar ich ja keinen traffic

java hamm glaub ich heutzutage viele leute nich mehr
wg microsofts ie-politik
außerdem treibt mir alles was ich über java weiß
-und das nich viel-
angstschweiß auf die stirn
damit solln sich die diplominformatiker rumschlagen :)

ich werd mir dieses shannon-fano-teil mal anschauen
google findet ja genug dazu

vielen dank!

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: