Autor Beitrag
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 14.04.05 10:11 
was eine eine idee währe:
wenn das Programm die Datei in einen richtig format bringen kann, das z.b. zip dann mit bis zu 100 % packen kann....

_________________
MFG
Michael Springwald, "kann kein englisch...."
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 14.04.05 10:24 
Man kann nicht jede beliebige Datei komprimieren. Eine Jpg oder mp3-Datei lässt sich nur minimal komprimieren, weil sie schon komprimiert sind. Da lässt sich auch nicht mehr viel tricksen. Und irgendwo ist bei jeder Komprimierung Schluss. Man kann nicht jede Datei auf eine Größe von ein paar Bytes reduzieren. Es geht einfach nicht.

Andere Dateien dagegen lassen sich sehr schön packen, und das kann man auch missbrauchen. Ein Beispiel dafür ist die Suche bei Google 42.ZIP. Per eMail verschickt an ein System mit Virenschutz, welches gepackte Anhänge entpackt, um sie auf Viren zu untersuchen...da freut sich der Anwender!

_________________
We are, we were and will not be.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Do 14.04.05 14:30 
user profile iconmimi hat folgendes geschrieben:
was eine eine idee währe:
wenn das Programm die Datei in einen richtig format bringen kann, das z.b. zip dann mit bis zu 100 % packen kann....

Wieso programmierst du's nicht einfach und wirst Millionär? -- Wenn es ein Programm gäbe, welches eine beliebige Datei in ein Format bringen würde, welches man mit Zip "bis zu 100% packen" könnte, wäre dieses Programm nicht schon längst ins Zip eingebaut worden? Überleg doch mal.

Die Information, die in einer Datei steckt, muss auch in der komprimierten Datei stecken (oder im Packer). Ein Packer kann nichts anderes tun als redundante Informationen zu löschen. Eine Transformation vor der Komprimierung kann hilfreich sein, wenn du Information über die Datei besitzt, welche Zip nicht ausnützt bzw. ausnützen kann. Wenn du aber selbst auch nichts weiteres über die Datei weisst, kannst du's vergessen.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 14.04.05 14:44 
Ich denk mal die maximale Kompressionsrate bei sinnvollen Texten, also wie Programmquelltexte, kann man die Datei maximal um 95% packen und auf keinen Fall mehr. Als nicht sinnvolle Texte sehe ich z.B. eine Textdatei die nur aus A besteht. Solche Dateien kann man auf fast 0% runterkomprimieren. Das Beipsiel habe ich auch mal ausgetestet.
unkomprimiert: 42,2 MB (44.353.984 Bytes)
komprimiert: 3,06 KB (3.141 Bytes) als rar-datei (maximale Kompressionsrate).
Wie du siehst kann man solche Dateien sehr gut kompremieren. Aber solche Dateien hat man ja schließlich normalerweise nicht :wink: . Bei meinem letzten Post hatte ich mal einen meiner Quelltext packen lassen (auf 8%), woran du auch siehst das sinnvolle Texte nie über 95% kompremiert werden. Allso ist es utopisch 4GB sinnvolle Dateien auf 20-30MB zu packen. Solche Dateien kannst du maximal auf 200MB komprimieren, und dann dürfen es auch nur Textdaien sein.

Das Verfahren, welches ich dir vorgeschlagen habe, ist so weit ich weiß auch das Verfahren auf das WinZip und WinRar bauen. Die unterschiedliche Packleistung hängt dabei nur von der Effektivität der Bibliotheken ab, wo momentan eindeutig WinRar vorne liegt. Das Problem bei solchen Packprogramme liegt an der richtigen Plazierung der Bibliotheken in der Datei.
Als Beispiel: ABBAGFFG (müsste natürlich viel länger sein)
Hier würde es sich lohnen nicht eine Bibliothek mit 4Zeichen anzulegen (also A, B, F, G), sondern 2 Bibliotheken: Bibliothek 1: AB
Bibliothek 2: FG,
da im ersten Abschnitt nur A und B vorkommen und im 2. Abschnitt nur F und G. Wenn diese Abschnitte länger sind als hier, dann spart man wesentlich mehr Speicherplatz als mit nur einer Bibliothek.
Und was Gausi sagte stimmt. Versuch mal ein Musikalbum zu komprimieren. Dann sparst du vielleicht von 120MB 3MB, bringt also nicht viel. Das Problem bei solchen Dateien ist dass sie schon auf ähnliche Art kompriemiert sind. Als Beispiel speichere mal eine Zahl als String ab und als Vergleich, mit z.B. TFileStream, eine Zahl als Integer. Dann wirst du sehen, dass z.B. 4294967295 nicht mehr 10Bytes (als String) benötigt, sondern nur noch 4Bytes. Und da z.B. mp3-Dateien schon solche Zahlen als Integer, und nicht als String, abspeichern kann, man die Zahl auch nicht viel weiter komprimieren.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 14.04.05 15:04 
@delfiphan
Das weiß ich*G*
Mir ging es nicht um eine perfekte und schnell komprimierung sondern einfach nur um die idee ob es geht oder nicht.
Aber nach meinen Test kann ich leider sagen das es mit 100% warschnilichkeit nichts bringen wird :cry:

@Heiko:
das verfahren verstehe ich nicht so ganz....

_________________
MFG
Michael Springwald, "kann kein englisch...."
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 14.04.05 15:14 
welchen Teil davon verstehst du nicht?
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 14.04.05 17:23 
z.b. was du mit Bibliotheken meinst :?

_________________
MFG
Michael Springwald, "kann kein englisch...."
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 14.04.05 19:40 
In die Bibliotheken speichert man rein, welche Zeichen vorkommen, welchen Wert diese haben und natürlich wieviel Bits ein Zeichen benötigt. Wie immer ein Beispiel dafür :wink: :
unkomprimiert: ABCDCDBA
komprimiert wird eingespeichert:
1. Die Zahl 4 (wieviel Zeichen in der Bibliothek sind)
2. Die Zeichen 1-4, also A (=0), B (=1), C (=2), D (=3) (damit kein das Programm weiß wo das Ende der Aufzählung ist, wurde davor die Anzahl eingespeichert)
3. Wieviel Bits ein Zeichen belegt: 2 (da mit 2^1 die Zahlen 0, 1, 2 und 3 dargestellt werden kann; maximal 1Byte, da jedes Zeichen, soweit ich weiß, genau 8Bits benötigt)
4. Der Text ABCDCDBA: 01232310 (die Zeichen mit dem Wert des Zeichen [der Wert wird durch die Reihenfolge der Zeichenfestlegung festgelegt] ersetzen; jede Ziffer hier belegt 2Bits, also die Bitanzahl die oben eingespeichert wurde).

Ich hoffe das du es jetzt verstanden hast, sonst muss ich mal am Wochenende einen Packer schreiben, obwohl ich eigentlich keine Zeit habe :wink: (wer hat den heutzutage überhaupt noch Zeit?).
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Do 14.04.05 20:17 
aso ich habe einen Punkt vergessen. Du musst noch einspeichern wo die nächste Bibliothek liegt, oder wie lang die aktuelle Bibliothek ist. Das kann man aber wegfallen lassen, wen man nur eine Bibliothek erstellen will.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Do 14.04.05 21:02 
Achso, und warum mehre BL reicht nicht eine ?

oder was auch schon reichen würde, wie so eine Datei im Textformat aussehen würde bei solchen einem text:

Zitat:
Hallo,
wie geht es dir ?

beispiel ?


Das mit dem Packer schreiben währe nicht schlecht, aber erstmal noch nicht. Aber danke für das angebot :shock:

_________________
MFG
Michael Springwald, "kann kein englisch...."
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 15.04.05 07:12 
Warum mehrere Bibliotheken an manchen Stellen sinnvoll sind, habe ich dir bereits in einem Post geschrieben (der 3., von mir, über diesem). Aber ich erklär dir das nocheinmal kurz. Stell dir einen Text vor der alle 256 Zeichen die es gibt beinhaltet. Da es relativ unwahrscheinlich ist das alle Zeichen ständig verwendet werden, oder das alle Zeichen in einem kurzen Text verwendet werden, ist es in diesem Fall sinnvoll mehrere BLs anzulegen, denn es gibt mit sehr hoher Wahrschenlichkeit Textabschnitte, die nur maximal 128 verschiedene Zeichen verwenden. Wenn man in solchen Fall dann eine neue BL einschiebt, benötigt mann, z.B. wenn im ersten Teil alle Zeichen verwendet wurden, nur 7 statt 8Bits für die Zeichen im folgendem Textabschnitt.

Bei deinem Text:
ausblenden Quelltext
1:
2:
Hallo,
wie geht es dir ?
hat es kein sinn mehrere Bibliotheken anzulegen, da der Text zu kurz ist und jedes Zeichen innerhalb eines kleinen Bereiches verwendet wird. Deshalb nehm ich nur eine Bibliothek. Ich nehme die Punkte aus dem vorletzten Post ohne weitere Erklärung (aber eine kurze Rückerinnerung), da ich die dort schon erklärt hatte.

1. 17 (Zeichenanzahl)
2. #13, #32, ?, ',', H, a, d, e, g, h, i, l, o, r, s, t, w (#13=Zeilenumbruch; #32=Leerzeichen; '' habe ich nur hinzugefügt, damit man erkennt, dass das Zeichen auch Zeichen ist und kein Aufzällungskomma).
3. 5 (sowiel Bis belegt ein Zeichen)
4. 4, 5, 11, 11, 12, 2, 1, 0, 16, 10, 7, 1, 8, 7, 9, 15, 1, 7, 14, 1, 6, 10, 13, 1, 3, 1

Mir ist aber nochwas eingefallen. Den Punkt 3 kannst du weglassen, da das Programm aus der Anzahl der Zeichen ermitteln kann. Dafür müsste an dieser Stelle stehen, wo die nächste BL steht.

PS: Ich wünsche dir viel Spaß beim Durchdenken des Punktes 4. Ich habe für diesen Post immer 1/2 Stunde gebraucht, da ich mir die Buchstaben per Hand sortiert und ausgetauscht habe.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Fr 15.04.05 09:29 
Du meinst also folgendes:
Du gehts davon aus das in einer Datei(bin) nicht alle zeichen das asscicode stehen, sehe ich das richtig ?
und jetzt sammelst du zeichen: du gehts mit einer schleife jedes zeichen durch wandels es in asscizeichen und sagt z.b. nach 10 zeichen eine neue BL gut z.b. so:

Ich habe jetzt eine Datei z.b. eine exe datei die möchte ich gerne packen.
Ich gehe diese datei zeichen für zeichen durch und nach 10 zeichen lege ich eine neue BL an,
damit ich das zeichen wiederherstellen kann verwende ich ein Trennzeichen z.b. ein, also so:
0,1,2,3,10,11,12,5,8,7,6
und davor speicherst du ab wie welches zeichen 0 steht z.b.:
0=120, 1=210, 2=215, 3=110,.....
das ist eigetnlich keine schlechte idee, wenn ich das richtig verstanden hab.

du müsstes sogar garnich abspeichern wenn die nächste BL ist die kannst du selbst ermitteln, du weißt wenn eine BL zu ende ist also fängt eine neue an bei nächsten zeichen.

also meine ich das jetzt:
0=120, 1=210, 2=215, 3=110,..... und das bis 10 und abspeichern würde ich das so:

120,210,215,110, ich weiß ja: das erste zeichen ist 0 und das zweite ist 1
0,1,2,3,10,11,12,5,8,7,6

und damit es noch besser wird: wenn ich z.b. auf ein zeichen komme was schon in einer BL steht kann ich ja ein verweis auf die BL bringen wo das zeichen drin steht, ob das was bringen würde ?

Nur dann müste ich die datei erstmal pasen und alle BL raußkopiern* z.b. in einer TStringList und dann kann ich ja einfach sagen, wenn du auf b34 trifst meine ich die 3 BL und das 4 zeichenm.

*oder es werden alle BLs am anfang gespeichert nur dann wird das entpacken recht aufwendig bzw. es könnte auch so gemacht werden:
Zitat:
0=120, 1=210, 2=215, 3=110,
0=140, 1=110, 2=210, 3=120,
1 BL*
0,1,2,3,10,11,12,5,8,7,6
2 BL*
0,1,2,3,10,11,12,5,8,7,6

* diese zeile würde ich nicht abspeichern also die datei würde dann so aussehen:
Zitat:

0=120, 1=210, 2=215, 3=110,
0=140, 1=110, 2=210, 3=120,
0,1,2,3,10,11,12,5,8,7,6
0,1,2,3,10,11,12,5,8,7,6

das würde glaube ich nichts bringen, aber irgenwie muss der Paser wissen wann eine BL gemeint ist und welcher index aus der BL gemeint ist.

Weil dann würde das bei großen dateien bestimmt was bringen.
Dann währe das doch auch egal, ob die datei mit ZIP schon gepackt wurden ist oder ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: Fr 15.04.05 18:50 
user profile iconHeiko hat folgendes geschrieben:
Warum mehrere Bibliotheken an manchen Stellen sinnvoll sind, habe ich dir bereits in einem Post geschrieben (der 3., von mir, über diesem). Aber ich erklär dir das nocheinmal kurz. Stell dir einen Text vor der alle 256 Zeichen die es gibt beinhaltet. Da es relativ unwahrscheinlich ist das alle Zeichen ständig verwendet werden, oder das alle Zeichen in einem kurzen Text verwendet werden, ist es in diesem Fall sinnvoll mehrere BLs anzulegen, denn es gibt mit sehr hoher Wahrschenlichkeit Textabschnitte, die nur maximal 128 verschiedene Zeichen verwenden. Wenn man in solchen Fall dann eine neue BL einschiebt, benötigt mann, z.B. wenn im ersten Teil alle Zeichen verwendet wurden, nur 7 statt 8Bits für die Zeichen im folgendem Textabschnitt.


Da ist es sinnvoll variable Bitzahlen für die Zeichen zu verwenden. Wenn du dann massenhaft "e"s hast, hast du dadurch auch nur einen sehr kurzen Code. Weniger häufig vorkommende Werte bekommen dann eben auch entsprechend längere Codes.

Siehe: de.wikipedia.org/wiki/Huffman

_________________
{$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Fr 15.04.05 19:22 
Die Idee finde ich nicht schlecht, bringt aber nicht unbedingt Vorteil, da man bei den meisten Zeichen noch mehr Bytes benötigt, da man ein Byte als Zeiger auf den Unterzweig benötigt. Aber es kann sein, dass das Verfahren bei größeren Dateien Vorteile bringt.

@mimi: Die BL hat keine feste Größe, sondern immer eine angepasste, so dass man mit einer BL am meisten spart. Ansonsten scheint es mir, als ob du das Verfahren verstanden hast.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Fr 15.04.05 21:19 
die e.wikipedia.org/wiki/Huffman kompirmierung finde ich nicht so gut: es wird irgenwie ein baum von zeichen angelgt und du musst diesen Baum mitabspeichern das, dauert und macht die datei nur größer... so wie ich es verstanden habe

@Heiko
ja bei kleinen dateien währe diese pack funktion besitmmt nicht so gut wie bei großen Dateien. aber ich kann mir schon vorstellen das es was bringt bei 2 GB dateien...
Das Problem ist nur diesen verweis zu machen: untern den BLs wenn da dann sowas steht:
3040459939
49588394B12

Ich weiß ja jede BL ist von 0-9 zeichen lang(standart größe.es sei denn es sind mehr oder weniger dann wird eine neue BL angelgt z.b. bei 11 zeichen oder so.
und wenn der Paser jetzt auf ein B kommt erwartet er eine 1 zeichen und danach noch eins das sind drei zeichen wie könnte man das verkürzen, das es auch was bringt.

ich werde den Packalgo mal schreiben und testen.
Hast du einen namen für den Pack algo ?
gibst den schon ?
(testen werde ich ihn aufjedenfall, weil die idee ist nicht schlecht.

_________________
MFG
Michael Springwald, "kann kein englisch...."
I.MacLeod
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 109



BeitragVerfasst: Fr 15.04.05 21:49 
user profile iconHeiko hat folgendes geschrieben:
Die Idee finde ich nicht schlecht, bringt aber nicht unbedingt Vorteil, da man bei den meisten Zeichen noch mehr Bytes benötigt, da man ein Byte als Zeiger auf den Unterzweig benötigt. Aber es kann sein, dass das Verfahren bei größeren Dateien Vorteile bringt.


Der Baum wird einmal abgespeichert. Wenn mans richtig macht ist der Overhead nicht viel größer als der bei deiner Methode - und die Kompressionsraten sind besser.

_________________
{$APPTYPE CONSOLE}uses SysUtils;const a='{$APPTYPE CONSOLE}uses SysUtils;const a=%s;begin write(Format(a,[#39+a+#39]))end.';begin write(Format(a,[#39+a+#39]))end.
mimi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Fr 15.04.05 22:00 
nagut, dann habe ich es falsch verstanden... mal schauen ob ich diesen packer überhaupt schreiben werde...

_________________
MFG
Michael Springwald, "kann kein englisch...."
jaenschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 89

Win XP, Debian
D7
BeitragVerfasst: Fr 15.04.05 22:03 
Ich kann mal die Arbeitsblätter von meinem Infolehrer empfehlen.
Da geht es auch um Kompression mit Hilfe von Wörterbüchern. Da wird das Verfahren erklärt, das auch bei zip-Dateien benutzt wird.
Ist wirklich interessant und wenn man sich Zeit lässt und drüber nach denkt, funktioniert es sogar :wink:
Einloggen, um Attachments anzusehen!