1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Textstellen Formatierung

    • Andy
    • 8. März 2013 um 16:04
    Spoiler anzeigen
    [autoit]

    $a="01.12.2012, 23:45 - Name Nachname: Nachricht101.12.2012, 23:46 - Name Nachname: Nachricht201.12.2012, 23:47 - Name Nachname: Nachricht3 ......."

    [/autoit] [autoit][/autoit] [autoit]

    $b=StringRegExpReplace($a,'(\d{2}).(\d{2}).(\d{4})',@crlf &'$1.$2.$3')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $b = ' & $b & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    meine bescheidenen Regex-Kenntnise reichen gerade noch dafür aus^^

    Kurze Erklärung:
    Das Datum tt.mm.jjjj (also 2 Ziffern, Punkt, 2 Ziffern, Punkt, 4 Ziffern) wird gesucht und durch @crlf tt.mm.jjjj ersetzt

  • AutoIt Versions-Archiv und Diskussionsthread (3.3.8.1 bis 3.3.10.2, Stand 30.12.13)

    • Andy
    • 8. März 2013 um 15:55

    Java und NET und auch JavaScript laufen heutzutage durch JIT-(Just In Time) Compiler, will heissen, sie werden zu Laufzeit in Maschinen-(oder wie von minx beschrieben Zwischencode) compiliert.
    Daher auch die unterschiedliche Laufzeit von Scripten im Browser bzw. auf unterschiedlichen Plattformen!
    Wie so oft hängt es an der Optimierung der plattformspezifischen Bibliotheken....

  • [C“ 2013] The winners!

    • Andy
    • 3. März 2013 um 17:43

    Mat´s Code läuft bei mir (nach Neustart Win XP32) einwandfrei.

    Zitat von minx

    Das Skript hätte man noch viel kompakter gestalten können

    aha...NOCH kompakter?

    [autoit='Beispielzeilen']

    Return ($kk[$kc]=$1 Or 0*Assign($2,$1=0)) And Assign($2,$kc+1) And $kc>9 And ka($3)+Assign("kc",0)

    For $4=199 To 0 Step -Assign("w",1,2)*Assign($2,Random(0,6,1),2)*Assign("x",5,2)+0*d(1,3,1)*d(1);...
    ExitLoop GUICtrlSetBkColor($s[$4/10+2][Mod($4,10)],0) And $4=0 And GUICtrlSetData($_[1],Execute($t))
    Next;...............................................................................................

    [/autoit]

    Mit Verlaub, er war imho der EINZIGE, der derart "kompakt" gescriptet hat! (I love iT :love: )
    Und auch das "Blockformat des Codes ausgenutzt hatte...^^
    Mit sämtlichen Features im Script der klare Gewinner! :thumbup:

    Aber auch Wambo war nah dran, alleine wegen der Idee!

  • AutoItDrawObject ( Nachfolger von QuickDraw )

    • Andy
    • 3. März 2013 um 09:18
    Zitat

    Kann man irgendwie erreichen, das der User die Größe des Fensters nicht verändern kann ?

    Ja, natürlich kann man das irgendwie erreichen.
    Genau wie bei deinem Problem mit

    Zitat

    Und kann man irgendwas machen das die Koordinaten für das Fenster nicht mehr relativ zwischen -1 und 1 angegeben werden müssen, sondern ganz normal als absolute Koordinaten?

    . Ja, da kann man auch "irgendwas" machen.

    Eine UDF besteht ausschliesslich aus einigen Zeilen Code und ist NICHT in Stein gemeißelt!
    Man kann daher ohne weiteres einige Funktionen selbst anpassen bzw. erweitern und diese dann den anderen zur Verfügung stellen. Dafür ist JEDER Entwickler extrem dankbar!

    Schwierig wird es für Entwickler, wenn jemand schreibt:" Ich benutze deinen Code, mich interessiert auch nicht wie es funktioniert, aber ich brauche noch X, Y und Z, setz dich mal in deiner Freizeit hin und bring das so hin, dass ich mir keine Arbeit mehr machen muss...."

    Oder willst du ernsthaft behaupten, du könntest keine Funktion erstellen, die Koordinaten umrechnet?

  • Happy Birthday Eukalyptus & Developer30

    • Andy
    • 2. März 2013 um 12:52

    Glücklichen Herzwunsch und alles Gute!!!

  • Revision Party 2013

    • Andy
    • 25. Februar 2013 um 13:21

    AMIIIIIIIIIIIIGAAAAAAAAAAAAAAAA!!

    Sollte nichts besonderes dazwischenkommen, bin ich dort....

  • _FTP_FilePut auch mit geöffneten Datein?

    • Andy
    • 24. Februar 2013 um 18:00

    Hi,
    schon mal irgendwann Software auf deinem Rechner aktualisiert?
    Was macht denn ein Programm, wenn es auf geöffnete Dateien trifft?
    Es schliesst entweder ungefragt die geöffnete Datei, oder es fragt nach.
    So kannst du es auch machen, entweder per "Ctrl+S" die Datei speichern und danach das Programm wieder mit dieser Datei laden (Liste aller geöffneten Files und deren Besitzer bekommt man über WMI) oder vorher "höflich" bitten, dass zu Fuss zu machen und dann auf "Fortsetzen" zu klicken....

    Zitat

    Wenn mir nämlich der PC abschmiert während des Bearbeitens ist alles verloren


    Welches brauchbare Programm hat keine Auto-Speichern-Funktion?

  • Mehrer Mauskoordinaten ermitteln, speichern und an einer anderen Stelle verwenden

    • Andy
    • 24. Februar 2013 um 17:44

    Hi,
    welches Programm soll den damit automatisiert werden?

    Zitat

    Soweit habe ich alles fertig,

    Es macht immer Sinn, den Code, den man bereits hat, anzuhängen bzw. zu posten, damit man konkret helfen kann! Also poste bittte dein bisher erstelltes Script!

  • Über die String-Dekompression

    • Andy
    • 24. Februar 2013 um 17:23
    Zitat

    Natürlich ist der Königsweg zum Komprimieren der von die genannte Weg, aber manchmal sind die alternativ Wege einfach nur genial...

    Ja, du hast natürlich völlig Recht!
    Wenn es schon eine "native" AutoIt-Funktion gibt, die etwas ähnliches macht, dann sollte man die auch benutzen!
    Aber wo bleibt denn da der Spass 8o ?
    Letztendlich gibt es alles schon irgendwo, man muss nur noch die Funktion runterladen und aufrufen, aber der Reiz am Programmieren ist doch (jedenfalls bei mir) auch mal eigene Gedanken einfließen zu lassen und eine Lösung weit abseits vom C&P zu erarbeiten.

    Zitat

    Die Idee ist einfach, dass man nicht den "lahmen" AutoIt Interpreter nimmt, sondern Built-In Funktionen.

    hehe, ;) , es lebe die WIN API :thumbup:

  • Über die String-Dekompression

    • Andy
    • 24. Februar 2013 um 14:55

    :D , das ist nicht neues...Problem ist (wie üblich bei den gängigen Kompressionen), die ZEIT.
    Kein Mensch (der eine SCHNELLE Kompression/Dekompression) braucht, wandelt Binärdaten in eine Bitmap (ok, DAS ist das einzig schnelle, die 54 Byte Header davorzusetzen^^) , um diese Bitmap dann in eine JPG/JPEG/PNG oder wasauchimmer umzuwandeln bzw zu komprimieren. Wieso dann nicht direkt ein Verfahren (Deflate) nehmen, dass für die Kompression dieser Daten geeignet ist?
    Da Deflate bei allen gängigen Kompressionsverfahren bzw. Zippern Verwendung findet, braucht man sich nicht zu wundern, dass auch die Ergebnisse ähnlich sind.
    Im Endeffekt läuft dann doch wieder alles auf die Huffmann-Kodierung raus :thumbup: , jaja Räder neu erfinden wird auch immer schwerer...

  • Skripte laufen unter Windows Server 2008 und 2012 nicht zuverlässig

    • Andy
    • 23. Februar 2013 um 11:45

    Hi,

    Zitat

    Zumindestens wenn ich mich dann abgemeldet habe.

    naja, bei einer remoteverbindung ein Script (lokal) zu starten, sich dann im Kontext abzumelden und dann zu erwarten, dass das Script weiterläuft ist in etwa so wie mitten beim Bergsteigen das Seil durchzuschneiden und oben auf dem Gipfel bei Nachfrage nach dem Kumpel zu sagen :"Komisch, bis vor 10 Minuten hing er noch dran..." ?(

    Btw, verbinde ich mich mit mehreren Servern, bin aber noch nie auf die Idee gekommen, während der laufenden Scripte die Session zu wechseln, das werde ich mal testen.

    Zitat

    Und warum funktioniert es nach einem Neustart nicht, sondern erst nachdem ich ein paar andere Sachen auf dem Server gemacht habe?

    dazu weiss ich zuwenig, ggf hängt es daran, dass bestimmte Dienste erst mit Verspätung gestartet werden.
    Mein Laptop bspw. zeigt beim booten den Desktop mit Win7 sehr schnell, alledings ist der Bootvorgang erst wesentlich später komplett abgeschlossen! Auf einige Dienste habe ich erst nach ca 1-2min Zugriff.

  • Skripte laufen unter Windows Server 2008 und 2012 nicht zuverlässig

    • Andy
    • 22. Februar 2013 um 20:20

    Hi,
    ich arbeite täglich mit mehreren größeren AutoItscripten in Produktivumgebung. Auf Server 2008, und div. BS als Clients. Überall ohne besondere bzw. Admin-Rechte, eher komplett ohne alle Rechte, wie sich das gehört.
    Ich habe auch noch nie bemerkt, dass es Probleme gäbe, die Server 2008-spezifisch wären. Einige Scripte laufen nachts stundenlang, aktivieren diverse Programme von Drittherstellern, lesen dort Daten aus und schicken mir im Fehlerfall (und natürlich im Erfolgsfall) Mails. Die Fehlermails gibt es höchstens, wenn ein Mensch vorher fehlerhafte Daten eingegeben hatte. Aus technischen Gründen gabs noch keine.

    Daher würde ich in Deinem Fall davon ausgehen, dass der "Fehler" nicht an AutoIt liegt, was auch diese Aussage bestätigen würde:

    Zitat

    Nachdem ich dann eine Weile lang mit AutoIt ein paar Skripte bearbeite und ausführe, funktionieren auf einmal die Send Befehle wieder und die Skripte laufen wie gewünscht ab.

  • Über die String-Dekompression

    • Andy
    • 21. Februar 2013 um 18:35

    SEuBo,
    RegEx ist bei weitem schon aus dem Rennen, da hättest du schneller sein müssen bzw. weiterlesen sollen ;)
    Aber vielleicht hast du trotzdem eine Antwort auf mein RegEx-Problem im Post 17?
    Ich gehe davon aus, dass mein Code wesentlich schneller ist, aber für kurze Strings bzw. andere ähnliche Anfragen wäre ein RegEx schnell getippert. Ausserdem muss man ja nicht dumm sterben, ich lerne trotz meines hohen Alters gerne immer noch dazu :D

  • Über die String-Dekompression

    • Andy
    • 20. Februar 2013 um 22:50
    Zitat

    Edit: Wenn bei mir die Klausuren rum sind bastele ich mal ein schönes Skript. Dann schauen wir mal wie 7Zip aussieht

    Yo, lass uns mal was machen, eine schöne Anwendung für OpenCl wäre noch der Knaller :thumbup:

    Zitat

    Mit anfänglichen 16Byte Tests macht man idr nichts verkehrt.

    doch^^, ich hatte anfangs auch nach bis zu 30 Byte langen Ketten gesucht. Da ist die Kompressionsrate natürlich gigantisch, aber die kommen definitiv viel zu selten vor....sucht man ab maximal 6-Byte Ketten, verringert sich die Kompressionszeit um die Hälfte! Bei gerade mal ca. 1-2% schlechterer Kompressionsrate! Praktisches Bsp s. oben
    Bei Bildern sieht das anders aus, im Deskstream habe ich imho 1024 gleiche Pixel durch 5 Byte ersetzt....

  • Über die String-Dekompression

    • Andy
    • 20. Februar 2013 um 22:48

    hehe....64bit....
    Ich wollte damals beim Deskstream einen Huffmann-Baum mit 64Bit bzw sogar 128Bit-Verweisen aufziehen. Das Problem ist aber bei JEDER Implementation das gleiche: Für wenig mehr an Kompression muss man einen gigantischen Aufwand betreiben. Und die gängigen Komprimierer haben ja alle mehrere Verfahren am Start. Und gerade beim Deskstream hat sich gezeigt, dass es eben nicht egal ist, ob man in 20ms oder in 500ms zum Ergebnis kommt! Bei den gängigen Verfahren ist das aber völlig egal! Da gibt es ganz andere Prioritäten! Würde man da nach schnellster Kompressionszeit wählen müssen, würden per se schon 90% der Verfahren aus der Auswahl rausfliegen!

    Im Deskstream-Thread gibts sogar von mir eine Anleitung, wie man die gängigen Komprimierer einbinden und testen kann...letztendlich hat´s nichts gebracht, sobald die Kompressionsrate verbessert wurde, ist die Zeit unverhältnismässig gestiegen, siehe diesen Thread^^.
    Ausserdem sollte das alles noch überschaubar bleiben. Wenn man erkennt, dass man die Codegrösse verhundertfachen muss um 5% besser zu komprimieren, dann lässt man als Hobbycoder die Finger davon^^

    In OpenCl/OpenGl sollte da noch etwas gehen, aber die gängigen Algorithmen sind nicht sehr gut bzw einfach zu parallelisieren. Für eine Framerate von 25FPS hat man dezente 40ms für den TRANSPORT der Daten (24MB bei 1024x1024x24bpp) übers Netz, und fürs Entpacken. Mal angenommen, 20ms gehen fürs Entpacken drauf, dann hat man 20ms übrig für den Transport der 24MB (die eingestampft auf ein Viertele bleiben 20ms für 6mb) was nach Adam Riese eine Leitung von 300Mb/s entspricht 2400Mbit NETTO. Macht erfahrungsgemäss Brutto locker das doppelte bzw das dreifache.... bei einem Viertel der Full-HD-Auflösung ^^
    Ergo kommt man sehr schnell auf den Trichter, dass es heutzutage garkeine Simultan-Übertragung geben kann (für den Otto-Normalverbraucher) und man doch lieber zu einem bis zum Anschlag komprimierten Video greift, dass (s. YT und Konsorten) mit einer bescheidenen Qualität erstmal minutenlang vorgepuffert werden muss. WzBw ;)

  • Über die String-Dekompression

    • Andy
    • 20. Februar 2013 um 21:31

    Hi,

    Zitat

    Jetzt noch Kombinationen mit 2, 3, n Bytes rein und die Kompression steigt nochmal an. Einpackzeit wird sich verhunderttausendfachen, Auspackzeit bleibt gleich.

    ja, das ganze habe ich aber schon hinter mir, bzw. verworfen aus einem einfachen Grund:
    Mehrfach, d.h. 3er, 4er, 5er usw. -Kombinationen aus unterschiedlichen Token (123abc345abc88abc) kommen idR SEHR selten vor.
    Die häufigste vorkommende 3er-Kombination kommt jedenfalls zwangsläufig seltener vor, als die am wenigsten festgestellte (und bereits komprimierte) 2er-Kombination (in abc ist nämlich schon ab enthalten) !
    Ich hatte dazu in einer Schleife 3er,4er und 5er Permutationen berechnet und deren Vorkommen im String gezählt (siehe Grund des asm-Scripts)
    Durch die etwas höhere Kompressionsrate und reichlich reservierte Token (die dann natürlich für die 2er wieder fehlen^^) kam ich zu einer Kompressionsrate von 49%. Die Laufzeit war allerdings mehrere Stunden, bis ich irgendwann abgebrochen hatte. UEZ komprimiert in seinem Script übrigens bei LZNT in der höchsten Stufe, und das ist kompressionstechnisch kein Stück besser als das AutoIt-Pendant!!!

    Sinn würde es ggf. machen, die Mehrfachkombis am Anfang zu testen und dann zu komprimieren. Allerdings ist man dann Laufzeittechnisch auch wieder angeschmiert, lediglich die Kompression würde sich verbessern, aber das tut sie ja ohnehin, wenn man die Laufzeit verlängert :P
    Also muss ein Algorithmus her 8o , der mit einfachen Funktionen arbeitet (AND/OR/XOR) oder den bereits komprimierten String nochmal völlig durcheinanderwürfelt (XOR würde sich da anbieten^^ )
    Wenn man mit einem wie auch immer produziertem zusätzlichen String XORed und nachher wieder einen sehr gut zu komprimierenden String erhält, dann könnte sich das lohnen.
    Mit Zufallsstrings XORen und nachher die Häufigkeit (s. asm-script) ermitteln, geht jedenfalls sauschnell 8o

  • [TCP Tool Help] Abgeschlossen

    • Andy
    • 20. Februar 2013 um 20:52

    Hi,
    du solltest, bevor du Scripte in der Schule installierst, wenigstens halbwegs beschreiben können, wie sie funktionieren.
    Jeder, der nur wenig Ahnung hat, bemerkt nach spätestens der 3. Frage, dass du keine hast....

    Zitat

    Wie ist das mit noip oder dyndns? brauch man das um eine stabile verbindung zu haben?

    Ich denke, die Rechner stehen in einem Raum oder befinden sich in einer Schule?! Wozu brauchts da ein DynDNS?

    Zitat

    Also sind die Programme die auf den "Schüler-PCs" aktiv sind die Server ja? 8|

    Das kann man so machen, muss man aber nicht. Ich würde es jedenfalls nicht so machen^^

    Zitat

    Mir ist wichtig dass der "Master-pc" jederzeit Verbindung herstellen kann und die "Schüler-PCs" steuern kann solange diese aktiv sind...
    Die Schüler-PCs sollen nur lauschen..

    Ok, fangen wir mal ganz von vorne an...
    Stell dir vor, das wären keine Computer, sondern Telefone. Auf jedem Schülertisch liegt eins, und auf dem Lehrertisch liegt eins. Vor der Stunde geht der Hausmeister hin und stellt eine Verbindung her zwischen dem Lehrertelefon und deinem. Wer da wen angerufen hat, ist erstmal völlig irrelevant, die Verbindung steht. Du kommst rein, setzt dich hin und telefonierst mit dem Lehrer.
    Ist jetzt wichtig wer von euch den anderen angerufen hat?
    Jetzt kommt ein andere Schüler in den Raum, greift sich ein Telefon und ruft einen von euch an. Was braucht er dazu?.....Richtig, eine Telefonnummer!(Merken!!!)
    Beim Angerufenen wird jetzt "angeklopft" und der "Empfänger" kann entscheiden, ob er den Anruf annimmt, oder es bleiben lässt.
    Wenn er den Anruf annimmt, dann kann er sich ohne Probleme mit dem anderen Unterhalten und Informationen hin und herschicken, heutzutage per Telefon auch Bilder, SMS usw.
    Mann kann auch die Daten/Unterhaltungen mit mehreren anderen teilen, als Konferenzschaltung oder per Makeln. Wenn einer der Teilnehmer auf die rote Taste drückt, dann wird die Verbindung beendet, völlig egal, wer wen angerufen hat.

    Ersetzen wir nun die Telefone durch Computer.
    Wenn jetzt einer der Teilnehmer den anderen Anrufen will, was braucht er da?..... Richtig, ne Telefonnummer. (Hast du dir das gemerkt?)
    Bei Computern heistt die Telefonnummer nur anders, ist aber genau das gleiche wie eine Telefonnummer!
    Nehmen wir an, du willst den Lehrercomputer "anrufen", dann brauchst du seine Nummer, rufst ihn an, und der Lehrercomputer entscheidet, ob er den Anruf annehmen will oder nicht.
    Umgekehrt ist das natürlich genauso!
    Auf Computerchinesisch übersetzt ist die Rufnummer eine IP-Adresse, der Angerufene ist der Server und der Anrufer ist der Client.
    Sobald die Verbindung hergestellt ist, ist es völlig egal, wer der Server und wer der Client ist, beide können Informationen miteinander austauschen! Allerdings entscheidet NUR der Server, ob er den Anruf bzw. die Verbindung mit dem Client annehmen will oder nicht! Und derjenige, der entscheidet, ist der CHEFFE! :D (Nochmal merken: Server=Cheffe! )

    Mit diesem Hintergrundwissen liest du dir deine Anforderungen nochmal durch:

    Zitat

    Also ich hätte es gerne so dass ich einen "Master" habe der viele "Schul-PCs" steuern soll... Beispielsweise herunterfahren soll...
    Diese Schul PCs sollen halt alle auf Kommandos vom Master lauschen...
    Und am besten wärs wenn alle lauschenden- in einer liste beim "Master" angezeigt werden ;O


    Wenn irgendwer irgendwen "steuern" soll, dann muss PERMANENT eine Verbindung bestehen! Verbindung weg, Steuerung weg! Wenn der "Master" also die "Anrufer" (wie heissen die auf Computerchinesisch? ) in irgendeiner Art und Weise beeinflussen will, müssen erstmal die Verbindungen hergestellt werden. Der Lehrer ist in eurem Fall der "Cheffe", die Schüler fragen bei ihm an, ob sie sich mit ihm verbinden dürfen (auf den Bauch mit euch, ihr Würmer! :P )
    So, nachdem jetzt die Hierachiefrage geklärt ist, und somit klar, wer der Server und der Client ist, brauchst du nur noch die in der Hilfe bei

    [autoit]

    TCPRecv() ;ist der SERVER
    TCPSend() ;ist der CLIENT

    [/autoit]

    enthaltenen Scripte zu starten. Das recv-Script kompilierst du als SERVER.EXE, die du dann startest. Anschliessend kannst du das Send-script starten. Es wird die Verbindung mit dem Server hergestellt. Lokal bei dir auf dem Computer. Willst du die Verbindung im internen Netz oder sogar über das Internet versuchen, empfehle ich dir die Lektüre HIER

    Wenn du diese beiden MINIMALST-Scripte verstanden hast bzw. versucht hast zu verstehen wie sie funktionieren, DANN können wir weitermachen, vorher hat das imho garkeinen Sinn.
    Genauso wenig Sinn macht es, ohne Ahnung irgendwelche Programme von irgendjemand anderem zu installieren, und zu hoffen, dass auf Anhieb alles reibungslos funktioniert. Das tut es nämlich definitiv NICHT! Aber dann macht es einen schlanken Fuss, wenn man wenigstens weiss, wo man den Fehler suchen muss 8)

  • Über die String-Dekompression

    • Andy
    • 20. Februar 2013 um 18:02

    Hi,

    Zitat

    dir sollte man den Dev-Titel verpassen.

    na die würden sich wundern :rofl:
    Dann müsste ich doch strukturiert programmieren, mich an alle möglichen und unmöglichen Vorgaben und Regeln halten, könnte nicht mehr einfach so drauflos tippern um schnell und simpel ein Problem zu lösen...
    Ne, lass mal stecken, in meiner wenigen Freizeit mach ich das, was mir Spass macht. ;)

    Vor den Dev´s habe ich allerhöchsten Respekt, und über Valik und seine liebreizende Art kann man sagen was man will, aber er hat sein Handwerk verstanden und mitgeholfen AutoIt zu dem zu machen, was es heute ist.
    Und wenn Profilneurotiker aufeinandertreffen, und jeder von beiden denkt er hat den höheren Skill, dann rappelt es eben. Ich finde es jedenfalls schade, dass er weg ist.

  • Seltsame Fehler... Warum greift IF nicht?

    • Andy
    • 20. Februar 2013 um 17:23

    Hi,

    Beispielsweise HIER gibts eine etwas ausführlichere Zusammenfassung zum Thema IF :D

  • Über die String-Dekompression

    • Andy
    • 20. Februar 2013 um 00:13

    s. mein Problem voriger Post....RegEx

    In einem Bruchteil der Zeit, in der ich über das RegEx nachgedacht hatte, sind einfach einige Zeilen Assembler zustandegekommen, die das Problem völlig erschlagen :D
    Kompression bleibt, Geschwindigkeit auf >1Mb/s erhöht beim Packen

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;~ #include <assembleit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Func _search()
    ;~ _("use32")
    ;~ _("mov esi,[esp+4]") ;pointer text
    ;~ _("mov edi,[esp+8]") ;pointer array
    ;~ _("mov ecx,[esp+12]") ;anzahl bytes im text
    ;~ _("")
    ;~ _("")
    ;~ _("start:")
    ;~ _("movsx eax,word[esi]") ;Bsp erstes word ist Ascii 4D -> EAX=0x00004434
    ;~ _("cmp al,70") ;byte grösser als F?
    ;~ _("ja weiter")
    ;~ _("cmp ah,70") ;byte grösser als F?
    ;~ _("ja weiter")
    ;~ _("sub eax,0x00003030") ;ascii nach binär umformen, aus AX=0x4434 muss AX=0x4D werden
    ;~ _("cmp ah,0x9") ;byte grösser als 9?
    ;~ _("jbe @f")
    ;~ _("sub ah,7") ;wenn byte >9 dann nochmal 7 abziehen, ascii A=0x41
    ;~ _("@@:")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _("cmp al,0x9") ;byte grösser als 9?
    ;~ _("jbe @f")
    ;~ _("sub al,7")
    ;~ _("@@:")
    ;~ _("xchg ah, al") ;ah+al tauschen -> AX=0x040D
    ;~ _("shl al,4") ;AL=0xD0
    ;~ _("shr ax,4") ;AX=0x004D
    ;~ _("add dword[edi+eax*4],1") ;zähler für dieses word um eins erhöhen
    ;~ _("weiter:")
    ;~ _("add esi,1") ;nächstes word holen
    ;~ _("loop start")
    ;~ _("")
    ;~ _("ret") ;bei DllCallAddress() MUSS hier ein RET 12 hin!!!!
    ;~ _("")
    ;~ EndFunc ;==>_search

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $file = @AutoItExe
    $stest = StringTrimLeft(StringToBinary(FileRead($file)), 2) ;0x entfernen

    [/autoit] [autoit][/autoit] [autoit]

    $len = StringLen($stest)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $len = ' & $len & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $a = compbin($stest)
    $m = TimerDiff($t)
    $stest = ""
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $alen = StringLen($a)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $alen = ' & $alen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($len / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite(@CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $b = decompbin($a)
    $m = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $blen = StringLen($b)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $blen = ' & $blen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $rate = Int($blen / $m)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $rate = ' & $rate & " KB/s" & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func compbin(ByRef $string)
    $len = StringLen($string)
    For $p = 0 To 15
    $token = Hex($p, 1) ;0-F
    $l = ""
    For $m = 1 To 7 ;0 bis 0000000, 1 bis 1111111 usw
    $l &= $token
    Next
    For $i = 7 To 3 Step -1 ;anzahl vorkommen
    $l = StringLeft($l, $i) ;
    $string = StringReplace($string, $l, $token & Chr(85 + $i), 0, 1);mehrfache ersetzen
    Next
    $string = StringReplace($string, $token & $token, Chr(Dec($token) + 71), 0, 1);doppelte ersetzen
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit()
    $255struct = DllStructCreate("dword[" & 256 & "]")
    $textstruct = DllStructCreate("char[" & StringLen($string) & "]")
    DllStructSetData($textstruct, 1, $string) ;string in struct, ist 5-6x schneller als string in dllcalladdress-funktion zu übergeben

    [/autoit] [autoit][/autoit] [autoit]

    Global $tCodeBuffer = DllStructCreate("byte[64]") ;reserve Memory for opcodes
    DllStructSetData($tCodeBuffer, 1, "0x8B7424048B7C24088B4C240C0FBF063C46772580FC4677202D3030000080FC09760380EC073C0976022C0786E0C0E00466C1E8048304870183C601E2CFC20C00") ;write opcodes into memory

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ $_assembleit_flag = 0
    ;~ _assembleit("ptr", "_search", "ptr", DllStructGetPtr($textstruct), "ptr", DllStructGetPtr($255struct), "uint", StringLen($string) - 1)

    [/autoit] [autoit][/autoit] [autoit]

    $ret = DllCallAddress("ptr", DllStructGetPtr($tCodeBuffer), "ptr", DllStructGetPtr($textstruct), "ptr", DllStructGetPtr($255struct), "uint", StringLen($string) - 1)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $array[16 * 16 + 1][2] ;anzahl der permutationen 00 bis FF
    For $d = 0 To 255
    $double = Hex($d, 2) ;00 bis FF
    $array[$d][0] = DllStructGetData($255struct, 1, $d + 1) ;anzahl vorkommen im string
    $array[$d][1] = $double ;ins array schreiben
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArraySort($array, 1) ;nach häufigkeit sortieren
    ; _ArrayDisplay($array)

    [/autoit] [autoit][/autoit] [autoit]

    $ersetzen_string = ""
    For $i = 0 To 160 ;ascii-zeichen von 105 -255
    $s1 = $array[$i][1] ;00 bis FF
    If $array[$i][0] = 0 Then ExitLoop ;kein string zu ersetzen
    $s2 = Chr($i + 95) ;doppelbyte wird ersetzt durch dieses byte
    $ersetzen_string &= $s1 & $s2 ;doppelbyte & byte
    $string = StringReplace($string, $s1, $s2, 0, 1) ;2-byte durch 1-byte ersetzen
    Next
    $string = $ersetzen_string & $string ; LUT vorne an string anhängen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Perc = Round(StringLen($string) / $len * 100)
    ConsoleWrite("!> Compression: " & $Perc & "%" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Return $string
    EndFunc ;==>compbin

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func decompbin($string)

    [/autoit] [autoit][/autoit] [autoit]

    While 1 ;1-byte durch 2-byte ersetzen
    $ersetzen = StringLeft($string, 3) ;erste 3 bytes im string
    If Asc(StringRight($ersetzen, 1)) < 95 Then ExitLoop;wenn 3.Zeichen kein ersetzen-byte, dann ende
    $string = StringTrimLeft($string, 3) ;erste 3 bytes abschneiden
    $string = StringReplace($string, StringRight($ersetzen, 1), StringLeft($ersetzen, 2), 0, 1) ;ein byte durch 2 byte ersetzen
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 71 To 86 ;ersetzt G durch 00, H durch 11 usw
    $a = Hex($i - 71, 1)
    $string = StringReplace($string, Chr($i), $a & $a, 0, 1)
    Next
    For $i = 87 To 93 ;x-fache token
    $a = Chr($i) ;
    $pos = 1
    Do
    $pos = StringInStr($string, $a, 1, 1, $pos + 1)
    If $pos <> 0 Then
    $char = StringMid($string, $pos - 1, 1)
    $ersetzen = ""
    For $q = 1 To $i - 85
    $ersetzen &= $char
    Next
    $string = StringReplace($string, $char & $a, $ersetzen, 0, 1)
    EndIf
    Until $pos = 0
    Next
    Return $string

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>decompbin

    [/autoit]


    Die AssembleIt()-Anwender werden feststellen, dass ich in diesem Beispiel den automatisch beim per $_assembleit_flag = 0 erstellten Code
    DllCall("user32.dll", "ptr", "CallWindowProcW",blablub
    durch
    DllCallAddress("ptr", DllStructGetPtr($tCodeBuffer),blablub
    ersetzt habe! Achtung! Dann ist es erforderlich, da DllCallAddress() den Stack nicht automatisch aufräumt, mit einem RET XX (Anzahl der Bytes der Parameter) den Stack "zu Fuss" aufzuräumen...
    Da ich aber auch nicht weiss, inwieweit DllCallAddress() in den älteren AutoItversionen funktioniert, ändere ich AssembleIt() nicht.
    Bei den Anwendern, bei denen DllCallAddress() nicht funktioniert, einfach die auskommentierten Zeilen aktivieren und nach F5 erscheint das Fenster mit dem C&P-Code.

    //Edit
    Es soll noch Leute geben, die mit einer Ascii-Code-Tabelle nichts anfangen können....
    In der AutoIt-Hilfe findet man sie im Anhang unter ASCII Zeichensatz, nicht schön aufgearbeitet bspw. hier.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™