CompressHEX - cHEX V1.00 - BETA 3

  • Hallo Community,

    aus aktuellen Anlässen habe ich meinen alten Kompressions-Algorythmus komplett neu aufgesetzt, ihn dabei kräftig aufgeppept und viele Neuerungen eingebaut. Da ich keinerlei Hinweise im Inet fand, wie ich eine solche Methode nennen sollte - taufe ich diese einfach 'File2Source' - File2Source ist einfach die Einbindung von Dateien im komprimierten Binärformat innerhalb von Sourcecodes.
    Im Normalfall bedeutet es das die Umwandlung einer Datei in das binäre Format eine Verdoppelung der ursprünglichen Dateigröße mit sich zieht. Da setze ich an, und der Algorythmus komprimiert die binären Daten auf die ungefähre Eingangsgröße. So kann man Dateien in Sourcecode einbetten - und wenigstens noch die Größe kompensieren.
    Ich habe eine kleine Gui erstellt, welche aber nicht 100%ig fertiggestellt wurde. Diese Version ist auch als BETA anzusehen, habe über 1300 Zeilen aus der Vor-Version entfernt und mich auf das wesentliche konzentriert. Ich werde cHEX auch noch weiter entwickeln - hab da noch ein Paar Dinge in der Hinterhand :D
    Das Komprimierte Ergebniss wird als AutoIt3 Sourcecode erstellt und wird in einer Funktion verbaut, welche durch einfaches Aufrufen die Daten De-Komprimiert ;)


    [VielText]
    Ich wollte das alte CompressHEX Verfahren bis auf den Kern entschlacken und dann in das mögliche Maximum treiben, wobei aber nicht die Kompressionsdauer in das unendliche schießen darf... So habe ich mir meine Gedanken gemacht, und überlegt wie ich mein Vorhaben mit AutoIt3 realisieren kann. Ich habe viel Hin-und-Her gebastelt und bin zu dem Entschluß gekommen das ich Multiprocessing verwende sowie einen 'Datapool-Cluster' in variabler Größe für die Eingangsdaten erstelle. So kann ich die Kompressionsdauer mit dem Multiprocessing, zumindest bei Mehrkernen, kompensieren. Wobei es dennoch teils gravierende Unterschiede in Dauer und auch in Größe des Ergebnisses kommt, das liegt einfach am Aufbau einiger Funktionen zugunsten der Kompressionsdauer.

    Nur das mit dem Multiprocessing stellt einen wieder vor anderen Problemen, und zwar die ungestörte Kommunikation zwischen Prozessen und Mainscript. Erst nahm ich einfache INI-Funktionen welche aber ein ungünstiges Zeichenmaximum haben, dann testete ich mit File Befehlen welche auch Probleme gemacht haben wenn mehrere Prozesse versuchen gleichzeitig eine Datei zu erstellen. Jetzt verwende ich TCP/IP mit unterschiedlichen Ports für die einzelnen Prozesse, welches richtig gut funktioniert! Es gibt keine Kommunikationsprobleme und auch die Ausführungszeiten sind besser gegenüber den Vorversuchen.
    Das Multiprocessing-Management wird von 4 Funktionen realisiert, hat einen einfachen Einstieg und das Multiprocessing wird dabei Funktions-Intern verwaltet. Auch liegt der Source des benötigen Kompressionss-Prozesses bei und muß entweder händisch Kompiliert werden, oder wird vor seinem Erststart vom Script aus kompiliert (vorige Meldung).
    Da ich das TCP Protokol verwende wird eine bestätigung der Windows-Firewall benötigt. Einfach das Programm anschliessend erneut starten und dann funktioniert es auch.
    Auch machen einige Virenscanner Meldungen oder verhindern die Ausführung, ich deaktiviere den Scanner einfach wenn ich cHEX verwenden will...

    Es gibt auch eine art Benchmarkfunktion die alle verbauten Kompressionsverfahren mit jeweils der gleichen Datei (AutoIt3.exe) durchlaufen lässt. Dabei wird die vergangene Zeit und die Kompressionsrate gemessen. Es ist eigentlich kein echter Benchmark weil ich mir keine Gedanken um eine Punktewertung gemacht habe - ist eher nur eine Testumgebung. Ich habe den ersten Durchlauf auskommentiert, der braucht weig...


    Technik


    Kompressionsverfahren : Diese 'File2Source' Variante besteht aus mehreren Funktionen, welche in Loops durchgelaufen werden. Der Input wird Binär eingelesen (somit doppelte Größe und nur noch 0-F), ein Prozess wird gestartet und mit TCP die Daten gesendet. Der Prozess führt die Kompression durch. Diese besteht aus 5 Hauptbestandteilen, die Durchlaufsteuerung (Einstieg: _CompressHEX), eine Analysefunktion (_HEXAnalyse), eine Ausstauschfunktion (_HEXReplace), und eine alternative Analyse- und Austauschfunktion (_HEXCrouch _HEXNewCrouch).
    _HEXAnalyse() : Erst wird ein Array erstellt, welche alle zu suchenden Strings beihaltet. Da gibt es 4 Möglichkeiten, Standart 2 Char (00-FF), Hardcore 3Char (Chars werden aus Input String gelesen), Zufall 3 Char (Char werden mit Random aus Input String gelesen) und Zufall-Detail 3 Char (Ein, durch Random gewählter Bereich des Strings wird verwendet)... Alle Analysefunktion besitzen ein Maximum in der Anzahl oder Suchbereichgröße, welche in der Main verändert werden können. Nach erstellung des Array wird es mit _ArrayUnique geklärt. Anschliessend wird das Array nach einer Trefferzahlauswertung sortiert. Das Array wird auf eine Länge von i_HEXAnalyse_Counts begrenzt.
    _HEXReplace() : Das erstellte Array wird als Rangliste zum Stringaustausch für den Input String verwendet. Da nicht alle 255 mögliche ASCII Zeichen als Austauscher verwendet werden können, fallen die ersten 31 Asciis aus UND die im a_NotReplace befindlichen. Hier wird ein Array erstellt, welches die bereits ausgetauschten Chars enthällt - und diese werden im nächsten Durchlauf auch als Austauscher ignoriert.
    _HEXCrouch() : Der bereits bearbeitete String wird auf identische Folgechars (0000, aaaaa, ..) durchsucht und diese werden auch durch noch mögliche Replacer ausgetauscht.
    _HEXNewCrouch() : Der bereits bearbeitete String wird auf identische Folge-Charpärchen (0101, ababab, ..) durchsucht und diese werden auch durch noch mögliche Replacer ausgetauscht.

    Durch die Begrenzung von i_HEXAnalyse_Counts laufen die 4 Funktionen so lange im Loop, bis alle möglichen Replacer verarbeitet sind.
    Es sind eine ganze Reihe von Variablen verfügbar, welche die Kompression beeinflussen:

    • $i_HEXAnalyse_Counts : Anzahl der Ergebnissdurchläufe
    • $i_HEXAnalyse_MinReplace : Mindest Treffer-Zeichenanzahl
    • $i_HEXAnalyse_Detail : Analyse Array-Typ
    • $i_HEXAnalyse_Detail_0Max : Typ 0 Maximum Ergebnisse
    • $i_HEXAnalyse_Detail_1Max : Typ 1 Maximum Ergebnisse
    • $i_HEXAnalyse_Detail_2Size : Typ 2 Maximum Größe
    • $i_HEXAnalyse_Detail_2Step : Typ 2 Schleifen-Step
    • $i_HEXAnalyse_MaxAuswertung : Maximum Auswertung
    • $i_HEXNewCrouch_Active : Zusätzlicher Wiederholungs-DoppelChar Such-Algorythmus
    • $i_HEXCrouch_Active : Zusätzlicher Wiederholungs-Char Such-Algorythmus
    • $i_HEXCrouch_MinSize : Mindesttreffer Zeichenanzahl
    • $i_HEXCrouch_Steps : Anzahl von einzeldurchläufen


    File2Source
    Besonderes Augenmerk habe ich auf die cHEX-Sourcecode Erstellung gelegt, diese kann als standart Source verwendet werden oder als 'Live' Source direkt aus den Funktionen des Hauptprogrammes erstellt werden. Wie bei der Prozesserstellung sind Vordefinierte Templates integriert.
    $i_HEXUse_SourceTyp : cHEX-Sourcecode Typ 0=AU3, 1=FB, 2=OCL
    $i_HEXUse_LiveSource : cHEX-Sourcecode als Live-Source (Standalone) Version erstellen

    Multiprocessing
    Wieso Multiprocessing? Weil AutIt kein Multithreading unterstützt, und Multiprocessing in jeder Sprache umgesetzt werden kann. Der benötigte Prozess liegt als Source bei und enthällt die Algoryhtmen.
    Die Kommunikation wird mit TCP/IP realisiert, welches die optimalste Lösung darstellt. Die Prozesskontrolle ist auch relativ einfach gehalten um einen eventuellen Overhead zu vermeiden.
    Für das Multiprocessing sind 2 Variablen verfügbar, welches die Erstellung des Prozesses beinflussen:
    $i_HEXUse_ProcessTyp : 0=AutoIt Prozess, andere entfernt
    $i_HEXUse_LiveProcess : 0=Vordefinierter Prozess, andere entfernt

    WinApi-LZNT Integration ** Deaktiviert!
    Ich habe noch eine weitere Kompressionsart hinzugefügt um mit LZNT eine höhere Kompressionsrate zu erreichen. Dies Methode wird vor der eigentlichen Kompression angewendet, und soll cHEX unterstützen.
    $i_HEXUse_LZNT : WinAPI-LZNT Kompression verwenden

    Infos


    Tab = Allgemein

    • Dateiname: Die zu komprimierte Datei, bei Verwendung von 'BuildInZip' ist auch Mehrfachauswahl möglich
    • Archivname: Unter dieser Datei wird das cHEX -Archiv oder -Source erstellt
    • Dateiformat: Festlegen was man erstellen möchte, einen vordefinierten Sourcecode oder ein cHEX-String
    • LZNT-Kompression: ** Deaktiviert ** Dieses Aktiviert das Dateien im vorraus mit LZNT bearbeitet werden
    • Prozessanzahl: Die Anzahl von verwendeten Prozessen für die Kompression
    • Clustergröße: Gibt die Größe an, in die der Input zerteilt wird. Hat Auswirkungen auf die Kompressionsrate
    • Single- / Multiprocessing: Ausführungsmethode, in Verbund mit der Clustergröße wird einer von vier Methoden verwendet


    Tab = Monitor

    • Prozesse: Status aller verwendeten Prozesse, Interne, Lokale und Globale Prozesse werden hier aufgeführt
    • Cluster: Status aller Cluster


    Tab = Optionen
    Programm Optionen: Hier stehen alle wichtigen, internen Variablen zur Kopmression, zum Editieren bereit:

    • TCP_Port = Der standart TCP-Port zur Kommunikation zwischen Main und Prozessen
    • UseProzesse = Anzahl von verwendeten Prozessen
    • HEXUse_ProcessTyp = Die Prozesse werden als 0=AU3 ausgeführt
    • HEXAnalyse_ClusterSize = Die Clustergröße bestimmen
    • HEXCompression_Mode = Intern, 0=Kompression, 1=DeKompression
    • HEXUse_LZNT = ** Entfernt ** 0=Kein LZNT, 1=LZNT verwenden
    • HEXUse_LiveSource = ** Entfernt ** 'File2Source' Funktionserstellung 0=Vordefiniert, 1=Funktionen wird aus der Main rausgelesen und verwendet
    • HEXUse_LiveProcess = ** Entfernt ** 0=Vordefinierten AU3-Prozess verwenden, 1=Prozessfunktionen werden aus der Main rausgelesen und verwendet
    • HEXAnalyse_Counts = Anzahl der Durchläufe, bevor Austauschungen vorgenommen werden (steigert die Genauigkeit)
    • HEXAnalyse_MinReplace = Anzahl von Mindesttreffern
    • HEXAnalyse_Detail = Analysefunktionsparameter 0=Hardcore (Max RAM verbrauch), 1=Zufallsuche (recht Schnell), 2=Detail-Zufallsuche
    • HEXAnalyse_Detail_0Max = Funktionsparameter für Hardcore-Detail
    • HEXAnalyse_Detail_1Max = Funktionsparameter für Zufallsuche
    • HEXAnalyse_Detail_2Size = Funktionsparameter für Detail-Zufallsuche
    • HEXAnalyse_Detail_2Step = Funktionsparameter für Detail-Zufallsuche
    • HEXAnalyse_MaxAuswertung = Finale Auswertung 0=Detail (langsam aber genauer), 1=Standart
    • HEXCrouch_Active = Letzte Replacersuche 0=Deaktiv, 1=Aktiv (kann bis zu 3% Rate steigern)
    • HEXCrouch_MinSize = Funktionsparameter für letzte Replacersuche
    • HEXCrouch_Steps = Funktionsparameter für letzte Replacersuche
    • HEXNewCrouch_Active_Active = Allerletzte Charwiederholungssuche 0=Deaktiv, 1=Aktiv (kann bis zu 2% Rate steigern)
    • Trenner = 2 Zeichen 1=Daten/Schlüssel/Wert-Trenner, 2=Sektions-Trenner
    • NotReplace = ASCII´s die NICHT getauscht werden dürfen
    • 'R': Einstellungs Reset, die intern vorgegeben Werte werden wieder hersgestellt.
    • 'O': Einstellunegen Laden
    • 'S': Einstellunegen Speichern, wird als Dateiname 'default.ini' gesetzt wird diese Datei als Standart-Setting zum Programmstart geladen
    • Übernehmen: ...Selbsterklärend

    [/VielText]

    Grüsse!

    Und Danke für alle 323 bisherigen Downloads :thumbup:


    [Images]

    [Blockierte Grafik: http://up.picr.de/20167428ow.jpg]

    [Blockierte Grafik: http://up.picr.de/20167429pa.jpg]

    [Blockierte Grafik: http://up.picr.de/20167430cy.jpg]

    [Blockierte Grafik: http://up.picr.de/20167431py.jpg]

    3 Mal editiert, zuletzt von Techmix (19. November 2014 um 14:45)

  • Hallo,
    aus aktuellen Umständen gibt es ein Update!

    Es ist noch ziemlig BETA sollte aber schon zuverlässig laufen (solange man nicht die Einstellungen zu sehr ändert). Habe die Tage 1200 Zeilen abgespeckt und mich auf die Kernfunktionen beschränkt. Es gibt noch Bugs, aber was soll´s ^^

    Grüsse!

  • ööööhhh, das hatten wir doch schon... 8)
    Über die String-Dekompression
    Im Verlauf dieses Threads ist auch das von mir verwendete Kompressions/Dekompressionsverfahren beschrieben.