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

  • Daten aus #cs / #ce einlesen / nutzen

    • Andy
    • 28. Juli 2022 um 09:05
    Zitat von BugFix

    Für mich bleibt noch immer die Frage, was im Kommentarblock für dich wichtig ist um es wann auszulesen und von wo aus (Datei geöffnet in SciTE oder innerhalb eines anderen Skriptes eingelesen).

    Ich hatte in AssembleIt (leider sind so gut wie alle Threads zu diesem Thema im Forennirwana verschwunden) den zu assemblierenden Code zwischen die #cs und #ce geschrieben, weiterhin konnte man so auch Funktionen direkt aufrufen deren Namen unmittelbar an #cs angeschlossen waren...

    AutoIt
    #cs Funktion1
        Bla                                                              ;dieser Kommentar wird entfernt
        Blub
    ;~   per CTRL+q auskommentierte Zeilen werden auch entfernt
        Tralala
    #ce Funktion1
    
    #cs Funktion2
        Code1                                                            ;dieser Kommentar auch
        Code2
        Code3
    #ce Funktion2
    
    
    $sFunc = "Funktion2"
    
    $asm = _StringBetweenXX(FileRead(@ScriptFullPath), "#cs " & $sFunc, "#ce")
    $startline = @extended                                               ;zeile, in der die funktion beginnt
    
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $asm = ' & $asm[0] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $startline = ' & $startline & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    
    
    Func _StringBetweenXX($s_String, $s_Start, $s_End, $v_Case = -1)
    
        $s_String &= ";"                                                 ;verhindert backtracking des regex
        ; Set case type
        Local $s_case = ""
        If $v_Case = Default Or $v_Case = -1 Then $s_case = "(?i)"
        ;auskommentierten code entfernen
        $s_String = StringRegExpReplace($s_String, '(?m)((?:[^''";]*([''"]).*?\2)*[^;]*)(;.*$)', "$1") ;alles ausser kommentarzeilen stehen lassen
    
    
        ; Escape characters
        Local $s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)"
        $s_Start = StringRegExpReplace($s_Start, $s_pattern_escape, "\\$1")
        $s_End = StringRegExpReplace($s_End, $s_pattern_escape, "\\$1")
    
        ; If you want data from beginning then replace blank start with beginning of string
        If $s_Start = "" Then $s_Start = "\A"
    
        ; If you want data from a start to an end then replace blank with end of string
        If $s_End = "" Then $s_End = "\z"
    
        Local $a_ret = StringRegExp($s_String, "(?s)" & $s_case & $s_Start & "(.*?)" & $s_End, 3)
    
        If @error Then Return SetError(1, 0, 0)
    
        $startline = 0
        $mid = StringMid($s_String, 1, StringInStr($s_String, $s_Start, 0, 1))
        StringReplace($mid, @CRLF, @CRLF, 0, 1)
        SetExtended(@extended + 1)
    
        Return $a_ret
    EndFunc                                                              ;==>_StringBetweenXX
    Alles anzeigen

    So konnte man während der Entwicklung in Scite per F5 den Assembler(code) laufen lassen, ohne andere Dateien verwenden zu müssen.

    Genau so kann man übrigens auch "versteckte" Funktionen in Kommentaren verwenden.

    //EDIT

    Die Startzeile der #ce benötige ich, um im Debugger die ggf. fehlerhafte Codezeile anzeigen zu können.

    Fehlerzeile=Startzeile+LineOfError

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Andy
    • 27. Juli 2022 um 07:33

    Hi,

    Für den Rechner ist der Scanner, je nach Konfiguration, nichts weiter als eine Tastatur.

    Du musst also nur die Tastaturcodes abfragen, Oscar hat hier ein entsprechendes Script vorgestellt.

    Ich benutze, da in meiner Anwendung Scanner und Tastatur gleichzeitig verwendet werden können, am Scanner einen identifizierenden Präfix, der nicht ohne weiteres per Tastatur dargestellt werden kann, ich nutze ASCII-Code 220 oder sonst einen esoterischen Code. Der Postfix ist CRLF.

    In der Anwendung wird jetzt bspw. von Anwender A ein Text eingegeben, gleichzeitig scannt Anwender B einen Barcode.

    Der Tastaturevent wird ausgewertet, jeder "normale" Tastaturcode wird nicht beachtet, d.h. an die Anwendung weitergegeben.

    Erkennt das Script im Tastaturevent den Präfix (ASCII 220), dann ist alles bis zum irgendwann folgenden CRLF der eingescannte Code.

    So kann man auch mehrere Scanner gleichzeitig an einem Rechner betreiben, das Script weist dann die Scancodes anhand des (logischerweise je Scanner unterschiedlichen) Präfix der entsprechenden Software und deren Inputfeldern oder anderen Eingabecontrols zu.

    Aber das musst du individuell auf deine Anwendung anpassen...

  • [Erledigt] Kann man bei SciTE den Compiler austauschen, der mit Ctrl+F7 aufgerufen wird?

    • Andy
    • 26. Juli 2022 um 17:15

    Hi zusammen!

    Ich hatte anfangs interessehalber mitgelesen und wollte auch schon die von BugFix angemerkten Hinweise zur au3.properties und SciteUser.properties posten...wenn man dann vergisst auf den "Antworten"-Button zu drücken, und es erst einige Tage später merkt, ist es wie immer zu spät^^

    Ich gehe stark davon aus, dass Alina einen der "offiziellen" Compiler meint.

    Zitat von Alina

    Nur ich möchte nicht, das mein AV jedes mal anschlägt und ich erst sagen muss, das diese oder jene Exe-Datrei vom Virenscan ausgeschlossen wird.

    Naja, das funktionier beispielsweise mit einigen der "SEHR" alten AutoIt-Versionen EINWANDFREI!

    Das Achiv findest du bspw. hier: https://www.autoitscript.com/autoit3/files/archive/autoit/

    Wenn man nicht unbedingt das "neumodische Gedöns" in AutoIt nutzen muss, tut es auch eine der älteren Versionen.

    Privat verwende ich "natürlich" immer die vorletzte neueste AutoIt-Version, incl. dem Ärger mit den Virenscannern falls jemand anderes eines meiner Scripte benutzen möchte. Das schlimme daran ist, dass diese Programme teilweise jahrelang völlig problemlos laufen und dann von einem wildgewordenen profilneurotischen Virenscanner in Quarantäne geschoben werden oder schlimmer, gleich gelöscht werden!

    Wenn das bei nicht PC-affinen Personen passiert, dann kannst du was von "Falschmeldungen" erzählen oder "false positives", das glaubt dir keiner mehr. Der Virenscanner hat nen Virus entdeckt und das Programm gesperrt, SO ein Programm will dann auch keiner mehr benutzen! :Face:

    Btw. seit ich vor einigen Jahren beschlossen habe, nur noch den Windows-Defender einzusetzen, habe ich auch keine "falschen" Virenmeldungen mehr...Im direkten Einzugsbereich habe ich also ALLE anderen Virenscanner von sämtlichen (ca. 15) Maschinen entfernt.

    Ich verwende dienstlich (imho seit knapp 11 Jahren) immer noch die 3.3.8.1 nicht zuletzt deshalb, weil trotz restriktivster Virenscannerei eines imho sehr guten Dienstleisters (die Firma bezahlt ein Vermögen dafür, ist aber auch angebracht) noch nie eine Meldung bzgl. eines meiner AutoIt-Programms kam!

    Und solange das so bleibt werde ich einen Teufel tun und auf eine der "neueren" AutoIt-Versionen upgraden!

    Never run a changing system! :o)

  • Winrm / Winrs

    • Andy
    • 15. Juni 2022 um 08:18

    Hi!

    Für WinRM existiert eine API, https://docs.microsoft.com/en-us/windows/win32/winrm/portal

    Zugriff dort gestaltet sich über Interfaces https://docs.microsoft.com/de-de/windows/win32/api/_winrm/

    Wsmandisp.h header - Win32 apps
    docs.microsoft.com

    Vom Thema habe ich wenig bis keine Ahnung, allerdings hatte ich mich im letzten halben Jahr intensivst mit Interfaces und deren Nutzung mit AutoIt beschäftigt.

    Der Einstieg ist sicherlich nicht simpel, lohnt sich aber m.E.

  • Internet-Kommunikation - Nervige PopUp-Fenster

    • Andy
    • 30. Mai 2022 um 21:20
    Zitat von BananaJoe

    - Wenn ich "nur so rumbrowse" dann mache ich das im Inkognito-Fenster, denn wenn ich das schließe, sind auch alle Cookies wieder gelöscht.

    - Bei meinen "Standard-Seiten", die ich besuche habe ich mir tatsächlich die Mühe gemacht, alles einzeln abzuwählen, so wie Bugfix es beschrieben hat.

    Genau SO mache ich das auch, in Opera ist das der Modus "Neues privates Fenster".

    Die Werbung entsorgt Pi-Hole nebenbei auf einem RasPi für alle Rechner und auch Smartphones im gesamten Netzwerk. Einige Webseiten, die ich unterstützen möchte und die auf Werbung angewiesen sind, werden gewhitelistet, der Rest wird geblockt.

  • Der Stumpfsinn der Gewohnheit - oder - Weil man das immer so macht.

    • Andy
    • 28. April 2022 um 15:37

    BugFix ,

    du bist einer der wenigen "Programmierer" (aka Menschen überhaupt) die ich kenne, die ihren Arbeitsablauf rekapitulieren, analysieren, nach Verbesserungen suchen und diese umzusetzen versuchen.

    Ich versuche das jedenfalls auch immer...

    Das von dir beschriebene "Problem" ist sowohl job- als auch generationenübergreifend, und tritt in der Programmiererei besonders extrem zutage.

    Woher diese/unsere "lösungsorientierte" Eigenschaft/Fähigkeit kommt, kann ich mir auch nicht erklären, bin aber permanent auf der Suche nach Mitarbeitern, welche diese Anforderung erfüllen können.

    Leider habe ich in den letzten ca. 50 Jahren nur sehr wenige dieser außergewöhnlichen Exemplare kennenlernen dürfen.

    Ich habe aber das Gefühl, das diese Spezies langsam aber sicher ausstirbt.....oder ich liege falsch und eine mir unbekannte Macht führt diese Menschen auf direktem Weg in das Unternehmen und somit auch in das Leben ihrer Träume.

  • WebP v0.5.0 build 2025-08-23 beta

    • Andy
    • 21. April 2022 um 11:41
    Zitat von UEZ

    Mehr zum Thema WebP API kann hier eingesehen werden: https://developers.google.com/speed/webp/docs/api.

    ....3 Sekunden gescrollt....und schon Krämpfe bekommen....

    Zitat

    Simple Encoding API

    Some very simple functions are supplied for encoding arrays of RGBA samples in most common layouts. They are declared in the webp/encode.h header as:

    Code
    <strong>size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride, float quality_factor, uint8_t** output);
    size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride, float quality_factor, uint8_t** output);
    size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride, float quality_factor, uint8_t** output);
    size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride, float quality_factor, uint8_t** output);
    </strong>

    The quality factor quality_factor ranges from 0 to 100 and controls the loss and quality during compression. The value 0 corresponds to low quality and small output sizes, whereas 100 is the highest quality and largest output size. Upon success, the compressed bytes are placed in the *output pointer, and the size in bytes is returned (otherwise 0 is returned, in case of failure). The caller must call WebPFree() on the *output pointer to reclaim memory.

    The input array should be a packed array of bytes (one for each channel, as expected by the name of the function). stride corresponds to the number of bytes needed to jump from one row to the next. For instance, BGRA layout is:

    image_layout.png

    There are equivalent functions for lossless encoding, with signatures:

    KLUGSCHEISSMODUS ON

    KATASTROPHE!!!!

    So etwas passiert, wenn derjenige, der eine Dokumentation schreibt, keine oder nur unzureichende Ahnung hat, von dem was er dort tut!

    Das sog. "Padding" beschreibt "aufzufüllende" Bytes am Ende einer Zeile, wenn die Länge der Zeile in Bytes nicht ganzzahlig (meist durch 4 geteilt) in das einlesende Format (meist 4 Bytes =>DWORD) passt.

    Beispiel: Format BGR oder RGB (24BitPerPixel BBP): In der Zeile sind 3 Pixel, multipliziert mit 3 Byte per Pixel ergibt 9 Bytes. Damit diese Zeile in DWORDs eingelesen werden kann, muss auf die nächste durch 4 teilbare Zahl an Bytes, also in diesem Fall 12 Bytes, aufgefüllt werden. Man hängt also an die 9 Bytes "Pixel" noch 3 (idR Null-)Bytes an!

    Ein sowieso durch 4 Bytes teilbares Format, (hier 32 Bit/4 Bytes) BGRA oder RGBA hat NIEMALS padding Bytes!

    Erstens setzt die Beschreibung vorraus, dass man sich den "Teiler" zur Ermittlung des Padding, also die in Bitmaps (idR verwendeten 4 oder welche Zahl auch immer) Bytes als Teiler der Zeilenlänge aus den Fingern zieht, in der Dokumentation steht dazu jedenfalls nichts!

    Zweitens ist die Darstellung in Tabellenform schlicht falsch, "padding bytes" sind nur bei den Formaten RGB/BGR erforderlich....

    Da ich aber davon ausgehe, dass diese API ausschliesslich von Leuten verwendet wird, die wissen, was sie dort tun, stelle ich mir einfach nur das kurze Grinsen derjenigen vor, die diesen "Fail" auch bemerkt haben :klatschen:

    KLUGSCHEISSMODUS OFF

    Habe auch mal in den Source-Code geguckt...ist natürlich vom allerfeinsten^^


    UEZ

    Klasse Arbeit!! :thumbup:

    Hast du die *.h-Files nach Freebasic transferiert und dann mit den *.lib Dateien gelinkt?

    Da ja sämtliche ausführbaren Dateien als Kommandozeilenversion vorliegen, könnte man über eine schicke AutoIt-GUI nachdenken...incl. Vorschaufunktion ggf. per UEZ´s UDF...

  • [Wettbewerb] String komprimieren

    • Andy
    • 28. März 2022 um 08:51
    Zitat von Mars

    Ich hab etwa 2000 Zeilen Spaghetticode fabriziert

    ...willkommen im Club....

    Ich bin durch eine Augen-OP seit einigen Wochen ziemlich eingeschränkt, daher weiß ich nicht, ob ich überhaupt bis zum Termin fertig werde. Aber die 50% habe ich schon (halbwegs locker) geknackt, sogar bei (*.unkomprimierteEXE-Binärdateien)

  • Steam spiel ownership verifikation. Aber wie?

    • Andy
    • 28. März 2022 um 08:44

    Hi,

    auf https://steamcommunity.com/dev erhälst du Zugriff auf die Steam-API (aktuell HIER).

    Dort kannst du über die Funktion GetOwnedGames sowohl die Userdaten, als auch das/die vom User bei Steam registrierten Spiele erhalten. Da diese Daten bei Steam abgefragt werden und nicht lokal (wie es die Spiele aufgrund des Offline-Modus machen müssen) bekommst du reale Daten. Der User muss zwangsläufig, wenigstens für die Abfrage bei Steam, online sein.

  • Performance-Analyse der neuen Datenstruktur "Map"

    • Andy
    • 20. März 2022 um 14:17
    Zitat von AspirinJunkie

    Meintest du Jon?

    Ja.....das Alter, du weißt schon^^

    Zitat von AspirinJunkie

    Bisher hat man sich in AutoIt beholfen das externe VB-(glaube ich)-Dictionary zu importieren.

    $oDictionary = ObjCreate("Scripting.Dictionary")

    Das meinte ich, was ist daran "extern"?

  • Performance-Analyse der neuen Datenstruktur "Map"

    • Andy
    • 20. März 2022 um 09:11

    Ich hatte auch erst anfangs Probleme mit dem Entpacken. Ich schaue per "Doppelklick" in die Zip-Datei, markiere dort die für mich interessanten Dateien, und kopiere sie in das von mir verwendete Verzeichnis.

    Das hat nicht funktioniert. Sehr seltsam...

    Was aber problemlos funktionierte war, die Dateien aus der Zip in das Downloadverzeichnis zu entpacken und von dort zu kopieren.

    AspirinJunkie

    Ich konnte die Ergebnisse von dir verifizieren, plus minus 10-20% in den Zeiten sehe ich bei diesen Laufzeiten der Scripte bei AutoIt einfach mal als "gleich" an^^

    Einzig die Datenbank/SQL-Scripte liefen bei mir ca. Faktor 30 schneller ab?!

    Welche Umgebung/Prozessor/Version nutzt du?

    Was als "Essenz" zu Maps eigentlich übrig bleibt, ist das es (wie so vieles andere in den "neumodischen" Programmiersprachen auch) überflüssig ist wie ein Kropf!

    Es gibt gegenüber den etablierten Methoden/Funktionen/Objekten Array und Dictionary(s) keinerlei Vorteile!

    Und so wie ich das sehe, weiß das Jos sehr wohl! Daher auch genau der "inoffizielle" Status in der aktuellen AutoIt-Version...

    Maps, kann man haben, muss man aber nicht!

  • Performance-Analyse der neuen Datenstruktur "Map"

    • Andy
    • 18. März 2022 um 13:24

    Hi AspirinJunkie!

    Du hast dich in dieses Thema ja "damals" voll reingekniet. Respekt jedenfalls dafür!

    Hat sich seit dem bzgl. Geschwindigkeit/Ansprechverhalten/Usability etwas gravierend geändert?

    Zitat von AspirinJunkie

    Assoziatives Array als 2D-Array mit binärer Suche hinzugefügt - interessantes Ergebnis da dies bei großen Datenmengen auch Map und Dictionary überholt.

    Ist das immer noch so?

  • AutoIt 3.3.16.0 ist zur Welt gekommen ...

    • Andy
    • 18. März 2022 um 13:04
    Zitat von gmmg

    Aktuell läuft bei mir ja alles in der 3.3.14.5. Ich warte da vielleicht noch etwas.

    Ich warte SICHER noch etwas...und zwar idR bis zur nächsten Version. Um dann auf die "alte" (für mich neue) umzusteigen. Das hat in den letzten Jahren gut funktioniert, da üblicherweise in den Wochen/Monaten nach Release der neuen Version reichlich Bugs gemeldet wurden, welche dann wiederum gefixt (oder aber auch nicht!) wurden....

    Wenn dann wirklich "stable" angesagt ist, drängen die User dann schon wieder auf eine "neue" Version, die dann auch bald erscheint...und der Kreis schließt sich, das Rad / die Mühle fängt sich wieder an zu drehen... :theke:

  • Wie suche ich Spalten in Excel?

    • Andy
    • 4. März 2022 um 20:24
    Zitat von BugFix

    Da VBA standardmäßig dazu gehört - eigentlich doch.

    Wobei sich mir immer wieder die Frage stellt, wieso man nicht direkt VBA nutzt statt AutoIt. Irgendwer muss ja die ganzen Excelsheets füllen, oder machen das die Leute alle "von Hand"? Und ja, das ist eine rhetorische Frage, 99% alle Excel-User tippern die Daten von Papierzetteln ab, oder kopieren oder schreiben aus andern Tabellen ab... :Face:

    Ein typisches XY-Problem:"...ich bekomm es in Excel nicht hin, also frag ich mal im Autoit-Forum, wie die das machen würden."

    Ich schätze diejenigen Excel.au3-Anwender, die die Daten aus Excel in anderen Programmen (NICHT AutoIt(!)) verwenden, auf unter 1%.

    Bei mir ist das genau umgekehrt, ich nutze in Excel zu 99% VBA und AutoIt nur, wenn Daten aus Excel in andere Software "eingetragen" werden muss. Aber selbst diese Scripte werden dann von VBA gesteuert.

  • [Wettbewerb] String komprimieren

    • Andy
    • 4. März 2022 um 19:14
    Zitat von Mars

    Ist also technisch gesehen ein Pastebin-Upload der zu "komprimierenden" Daten und das Ausgeben der ID (8 Zeichen) eine valide Methode? :party1:

    Warum nicht?!

    Jetzt höre ich schon das Geheule! Und genau dieses Geheule kommt von den Leuten, die Nervenzusammenbrüche bekommen, wenn sie, mit welchem Gerät auch immer, NICHT online sind :Face:

    Aber mal ohne Witz, ob man heutzutage eine Textdatei mit einer Größe von einigen Kilobytes versendet, oder nur 40% von einigen Kilobytes, das ist bei der Menge an Müll, der heutzutage das Internetz flutet, völlig unerheblich ;)

    Wahrscheinlich sehe ich das so locker, weil ich bei keinem einzigen dieser "sozialen" Medien einen Account habe und deshalb zwangsläufig online sein MUSS. Was nicht bedeutet, dass ich nicht für sämtliche Internetfähigen gadgeds Software erstelle. Bei denen auch des öfteren Komprimierungsalgorithmen verwendet werden :rock:

  • [Wettbewerb] String komprimieren

    • Andy
    • 4. März 2022 um 16:36
    Zitat von Mars

    Das wäre dann wieder soetwas wie: Ich habe das Wörterbuch nicht in den Komprimierten Daten, und ohne das Wörterbuch sind die komprimierten Daten keine valide Beschreibung der unkomprimierten Daten...

    Aber das ist doch genau der Punkt! Ähnliches hatte ich bereits in #31 gepostet.

    Ab wann tut denn das Wörterbuch im Script/Programm "weh"?! Genau DAS ist das Problem!

    Der aktuelle Download von 7-Zip ist entpackt auf der Platte etwas über 5MB, davon Programm und DLL zusammen 2.5 MB.

    Ein vom allerfeinsten C(++)-Compiler erstelltes Kompressions-Programm, dessen "Packcode" auf eine DIN-A4 Seiten passt?!

    Im Leben nicht..... ^^

    "Natürlich" ist der eigentliche Packcode Pillepalle, das wirklich Aufwendige ist die Analyse und die "optimale" Auswahl eines der dutzenden von Verfahren um "eine Handvoll Bytes" einzusparen.

    Wenn ich ein compiliertes AutoItscript mit 500KB =O ansetze, dann blieben mir, um mit der Dateigröße von 7-Zip mitzuhalten, also 2MB an "Daten" die ich in der Datei unterbringen könnte!

    2MB an verschiedensten "Wörterbüchern" oder neuronalen Netzen oder was auch immer.....

    Und btw.: der Kollege Lambdax könnte das von ihm benötigte "Wörterbuch" unkomprimiert 300x nacheinander in seine EXE schreiben und die Datei wäre immer noch kleiner als 7-Zip und würde besser komprimieren! Soviel zum "Problem"! :theke:

  • [Wettbewerb] String komprimieren

    • Andy
    • 4. März 2022 um 08:06

    Hmmmmmm, interessanter Ansatz, den ich mir auch schon überlegt hatte! 8o

    Nirgendwo ist die maximale Größe des Scriptes definiert.

    Wenn ich also bspw. die Wortliste des Openthesaurus (Größe ca 2 MB und soviel ist das garnicht, die könnte man nämlich vorher komprimieren :rofl: ) in mein Script includiere, dann damit einen "optimalen" Baum aufspanne und dann einfach nur "dröge" ersetze, dann ist das ziemlich nah am Optimum!

    Aber wie bereits oben von mir gesagt.....reine Fingerübung und daher völlig außen vor, jedenfalls bei mir.

    Hier geht es darum, sich selbst ein Verfahren zu überlegen, also einen Algorithmus umzusetzen.

    Hehe, böse betrachtet könnte man ja die Scriptgröße * Kompressionsrate bewerten.... :Face:

  • [Wettbewerb] String komprimieren

    • Andy
    • 3. März 2022 um 15:29
    Zitat von Mars

    PS: Da geht aber noch was... Benutze deine Fantasie :P

    (auch wenn es verlockend ist, Algorithmen zu nutzen die weit verbreitet und erprobt sind. Wir sind hier ein Forschungsteam, wir brauchen den neuen Stuff

    GENAU SO sehe ich das auch....

    Den Code von den entsprechenden Webseiten abklimpern oder Verfahren "kopieren" das sollen Leute machen, die Fingerübungen brauchen, denn mehr ist das imho nicht.

    Zitat von Mars

    Ich habe vor langer Zeit mal etwas gebastelt (ein adaptiver Huffman Codierer mit coolem Tree der sich dynamisch anpasst), der läuft aber mit ca. 1 BYTE pro Sekunde^^ Also vermute ich, dass der Algorithmus in nativem AutoIt (ohne Dllcalls) mit sagen wir mal: 128+Byte/s klarkommen muss

    So etwas will ich hier sehen! :thumbup:

    Übrigens ist es sehr produktiv, solche Gespräche in einer Kneipe zu führen und dabei die "dynamischen Bäume" hinten auf Bierdeckel zu kritzeln...das wäre übrigens mal wieder fällig :party:


    Ich bin aktuell schon bei ziemlich guten Kompressionsraten von Textdateien, einiges hatte ich allerdings schon im Deskstream-Script und auch in der Steganographie erstellt.

    7-Bit-ASCII, Lauflängenkodierung und ein etwas abgefahrener "Baum" und natürlich wieder mal Gequetsche von mehr als 12 Bits in ein Byte :rock:, das ist mein aktueller Stand. Bei Textdateien liege ich "ziemlich gut" im Rennen, wenn auch langsam....aber wie üblich, habe ich, sobald alles läuft, auch eine Assemblerversion (SSE und AVX512)

    Das aufwendigste ist aktuell, die Bits zusammenzuquetschen, d.h. an Bitadressen zu schreiben/zu lesen und nicht an Byteadressen!

    In Assembler ist das ziemlich einfach und auch schnell. Naja, vielleicht schreibe ich in AutoIt die Bits einfach als 1 und 0-Char nacheinander in eine Bytestruct und lese von dort dann in 32er Paketen über eine LUT die DWORDS aus....schaumamal.

    Zitat von Mars

    Wenn man das alles macht schätze ich, dass locker 50%+ drin sind

    Da ist jetzt schon wesentlich mehr drin^^ 8o

    Aber in dem Dilemma stecke ich aktuell auch fest: Gebe ich den (dynamischen) Baum mit in den komprimierten String, dann tun bei kleinen Strings die 256/512 Bytes so richtig weh....bei sehr großen Strings fällt das dagegen kaum auf.

    Das blöde dabei ist, dass bei großen Textdateien der statische Baum völlig ausreichend ist und ich nur ein Bit im komprimierten String brauche, um diesen zu aktivieren.

    Wobei ich auch bei Nicht-Textdateien (*.EXE Bilddateien usw.) mittlerweile schon unter 50% gelandet bin (bei Verwendung von dynamisch erstelltem Baum)

  • Formel noch nicht gefunden : Ich liebe Menschen die nicht einmal für eine Krone mit denken (mitdenken ?) !

    • Andy
    • 27. Februar 2022 um 09:43
    Zitat von Alina

    Ja, ich dachte ich komme an Algebra vorbei, denn das in AutoIt umzusetzen ist ja wie o. g. von AspirilJunkie u. Andy ein Aufwand den ich noch nicht ganz nachvollziehen kann.

    Das was AspirinJunkie und ich als Scripte gezeigt haben ist ein mathematisches Verfahren zur Lösung linearer Gleichungen. Also Stoff aus dem Mathe-Untericht 9. Klasse (auch in Dänemark^^)

    Wenn du x Gleichungen mit x Unbekannten hast, dann ist dieses System IMMER lösbar!

    Zitat von Alina

    Ich habe versucht eine eigene Formel zu erstellen:

    Was du nicht brauchst, denn wenn du x Gleichungen hast mit x Unbekannten, dann kannst du das auch lösen!

    Zitat von Alina

    Ich brauche die Lösung für dieses Problem, da ich etwas größeres vorhabe. Ich möchte was codieren.
    Klartext: Passwort
    Codiert 1: 2072674714768072


    Den Code sollte man nämlich nicht so einfach "knacken" können. Oder?

    Wenn du auf der Grundlage linearer Gleichungen eine "Verschlüsselung" machen willst, bekommst du definitiv Probleme bei der Sicherheit, wenn du "normale" Zahlen verwendest.

    Das Problem ist, dass du anhand des Ergebnisses IMMER die Faktoren bestimmen kannst!

    Um dein Gleichungssystem und deine Verschlüsselung zu "knacken" brauchst du also nur eine bestimmte Anzahl Klartexte und die daraus kodierten Passwörter.

    In der Kryptologie gibt es viele Verfahren die eben genau deswegen NICHT (so einfach) umkehrbar sind. Beispielsweise werden dort SEHR große Zahlen durch die Multiplikation von ebenfalls SEHR großen Primzahlen erzeugt. Umgekehrt dauert es auch mit heutigen Rechnern extrem lange, diese großen Zahlen wieder in ihre Primfaktoren zu zerlegen.

    Aber ich glaube sowieso, dass du eher im Bereich einer kryptografischen HASHfunktion suchen solltest!

    Eine HASHfunktion erzeugt aus einem Klartext einen entsprechenden Ausgabewert. Das gute an der Hashfunktion ist, dass selbst wenn sich in der Eingabe nur EIN BIT (!) ändert, sich der Ausgabewert komplett ändert. Man kann auch nie vom Ausgabewert auf den Eingabewert rückschließen bzw. diesen "einfach" berechnen. Beispiele sind MD4 oder MD5 oder SHA...die kennst du sicher oder hast schon mal etwas davon gehört!

    Der Sinn ist, Passwörter NIE direkt abspeichern zu müssen, sondern NUR den Hashwert.

    Wenn du also dein Passwort eingibst, dann wird daraus der Hashwert berechnet und NUR DER wird im Programm/Datenbank mit den Zugangsdaten abgeglichen.

    Ein Hashwert ist in der Regel auch immer gleich lang, egal wie lang der Eingabewert ist! Man kann also nicht aus der Länge des Hashwertes auf die Länge des Passwortes schließen.

    Ich selbst habe schon mehrere Hash-"Generatoren" geschrieben bzw. selbst ausgedacht und in Programmen eingesetzt, im Prinzip ist das nur Bitschieben- oder rotieren, bzw Bitmanipulation. Zusätzlich noch einige Bits "einstreuen" (ähnlich SALT) dann bist du fertig.

    Wichtig ist nur, dass die Funktionen nicht umkehrbar sein dürfen! Und eine GUTE selbstgeschriebene (und für andere bis dato unbekannte) Hashfunktion ist immer besser als eine der bekannten, wie bspw. MD5 oder SHA-1!

  • Formel noch nicht gefunden : Ich liebe Menschen die nicht einmal für eine Krone mit denken (mitdenken ?) !

    • Andy
    • 24. Februar 2022 um 08:54

    Hi,

    lineare Gleichungen lösen....da hatte ich vor Jahrzehnten mal was gebastelt, sogar mit GUI^^

    Seitdem wird dieses Script immer wieder mal von mir benutzt, wer Spass hat, kann ja die GUI auf "schön" umfunktionieren.

    Und btw. es wird das Gaußsche Eliminationsverfahren verwendet.

    AutoIt
    #include <GUIConstantsEx.au3>
    
    ;~ ;linearer gleichungslöser nach Gaußschem Eliminationsverfahren,
    #include <array.au3>
    ;~ $n = 3
    ;~ Dim $a[$n][$n] = [[1, 1, 0],[0, 1, 1],[1, 0, 1]] ;matrix
    ;~ Dim $b[$n] = [100, 200, 240]                       ;lösungen
    
    ;~ ;$n = 4
    ;~ ;Dim $a[$n][$n] = [[1, 3, -2, 1],[-2, 1, -4, -5],[1, -3, 1, 0],[-3, 4, -6, 2]] ;matrix
    ;~ ;Dim $b[$n] = [-7, -6, 6, -21]                 ;lösungen
    
    ;~ $s = _solve_linear_quad($a, $b)
    ;~ _ArrayDisplay($s)
    
    
    
    Global $num_unknowns = Number(InputBox("Lösung Lineare Gleichungssysteme", "Anzahl Unbekannte?", 3))
    Dim $coeff[$num_unknowns][$num_unknowns] ;matrix
    Dim $values[$num_unknowns + 1][$num_unknowns + 2] ;
    Dim $b[$num_unknowns]         ;lösungen
    GUICreate("Enter Equations:", (48 * $num_unknowns) + 121, (26 * $num_unknowns) + 77)
    For $n = 1 To $num_unknowns
        For $r = 1 To $num_unknowns
            $values[$n][$r] = GUICtrlCreateInput("", 48 * $r, 26 * $n, 25, 21)
            GUICtrlCreateLabel(StringMid("abcdefghijklmnopqrstuvwxyz", $r, 1), (48 * $r) + 26, (26 * $n) + 5, 10, 17)
            If $r < $num_unknowns Then
                GUICtrlCreateLabel("+", (48 * $r) + 37, (26 * $n) + 5, 10, 17)
            Else
                GUICtrlCreateLabel("=", (48 * $r) + 37, (26 * $n) + 5, 10, 17)
            EndIf
        Next
        $values[$n][$r] = GUICtrlCreateInput("", 48 * $r, 26 * $n, 25, 21)
    Next
    $solve_button = GUICtrlCreateButton("Lösen", (48 * $num_unknowns) + 38, (26 * $num_unknowns) + 36, 50, 25)
    GUISetState()
    
    While 1
        $msg = GUIGetMsg()
        Switch $msg
            Case $GUI_EVENT_CLOSE
                ExitLoop
            Case $solve_button
                For $n = 0 To $num_unknowns - 1
                    For $r = 0 To $num_unknowns - 1
                        $coeff[$n][$r] = Number(GUICtrlRead($values[$n + 1][$r + 1]))
                    Next
                    $b[$n] = Number(GUICtrlRead($values[$n + 1][$num_unknowns + 1]))
                Next
    ;~             _arraydisplay($b)
    ;~             _arraydisplay($coeff)
    
                GUISetState(@SW_HIDE)
                $sols = _solve_linear_quad($coeff, $b)
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sols = ' & $sols & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
                $solutWin = GUICreate("Lösungen:", 280, (21 * UBound($sols)) + 42)
                For $n = 0 To UBound($sols) - 1
                    GUICtrlCreateLabel(StringMid("abcdefghijklmnopqrstuvwxyz", $n + 1, 1) & " = " & Round($sols[$n], 3) & "   (Max. 3 Nachkommastellen)", 30, 21 * ($n + 1), 200, 20)
                Next
                GUISetState(@SW_SHOW, $solutWin)
        EndSwitch
    WEnd
    
    
    
    
    Func _solve_linear_quad($a, $b) ;matrix,lösung  Gaußsches Eliminationsverfahren, löst  x gleichungen mit x unbekannten
        ;by Andy  www.autoit.de
        Local $n, $t
        Dim $Y[UBound($b)]        ;ergebnisse
        $n = UBound($a) - 1       ;anzahl der zeilen/spalten
        ;falls erforderlich, zeilen und spalten tauschen
        If $a[0][0] = 0 Then      ;wenn erster koeffizient = 0, dann kann das system nicht starten => spalten tauschen ggf zeilen tauschen
            For $k = 0 To $n      ;jede zeile
                For $j = 0 To $n  ;alle spalten in dieser Zeile testen
                    If $a[$k][$j] <> 0 Then
                        For $m = 0 To $n ;treffer, die erste spalte mit der j. tauschen
                            $t = $a[$m][$j] ;sichern
                            $a[$m][$j] = $a[$m][0] ;mit erster spalte tauschen
                            $a[$m][0] = $t
                        Next
                        For $j = 0 To $n ;zeilen tauschen
                            $t = $a[0][$j] ;sichern
                            $a[0][$j] = $a[$k][$j] ;mit erster spalte tauschen
                            $a[$k][$j] = $t
                        Next
                        $t = $b[0] ;ergebnisse auch tauschen
                        $b[0] = $b[$k]
                        $b[$k] = $t
                        ExitLoop 2
                    EndIf
                Next
            Next
        EndIf
    
        If $a[0][0] = 0 Then Return SetError(1, 0, 1)
    
        ;endlich rechnen :)
        For $I = 0 To $n          ;alle zeilen
            If $a[$I][$I] <> 0 Then
                ;erstes element auf 1 bringen indem man gesamte zeile durch erstes Element teilt
                For $k = $I To $n
                    $t = $a[$k][$I] ;erstes element merken
                    If $t <> 0 Then ;nur, wenn das erste element ungleich null ist...
                        For $j = $I To $n
                            $a[$k][$j] /= $t ;alle zeilenmitglieder durch erstes element teilen
                        Next
                        ;b durch i teilen
                        $b[$k] /= $t ;ergebnis natürlich auch
                    EndIf
                Next
                ;  _ArrayDisplay($a, "oben " & $I)
                ;zeile i von allen weiteren zeilen subtrahieren, erstes element wird zu 0
                For $k = $I + 1 To $n
                    If $a[$k][$I] <> 0 Then ;wenn null, dann überspringen
                        For $j = $I To $n
                            $a[$k][$j] -= $a[$I][$j] ;die i.zeile von der aktuellen zeile subtrahieren
                        Next
                        $b[$k] -= $b[$I] ;ergebnisse natürlich auch
                    EndIf
                Next
                ;   _ArrayDisplay($a, "unten " & $I)
            Else                  ;null in aktueller spalte
                ;zeilen tauschen
                ;    msgbox(0,$i,"null gefunden")
                For $k = $I + 1 To $n
                    If $a[$k][$I] <> 0 Then ;zeile tauschen
                        For $j = $I To $n ;zeilen tauschen
                            $t = $a[$I][$j] ;sichern
                            $a[$I][$j] = $a[$k][$j] ;mit erster spalte tauschen
                            $a[$k][$j] = $t
                        Next
                        $t = $b[$I] ;ergebnisse auch tauschen
                        $b[$I] = $b[$k]
                        $b[$k] = $t
                    EndIf
                    ;erstes element auf 1 bringen indem man gesamte zeile durch erstes Element teilt
                    For $k = $I To $n
                        $t = $a[$k][$I] ;erstes element merken
                        If $t <> 0 Then ;nur, wenn das erste element ungleich null ist...
                            For $j = $I To $n
                                $a[$k][$j] /= $t ;alle zeilenmitglieder durch erstes element teilen
                            Next
                            ;b durch i teilen
                            $b[$k] /= $t ;ergebnis natürlich auch
                        EndIf
                    Next
                    ; _ArrayDisplay($a, "oben1 " & $I)
                    ;zeile i von allen weiteren zeilen subtrahieren, erstes element wird zu 0
                    For $k = $I + 1 To $n
                        If $a[$k][$I] <> 0 Then ;wenn null, dann überspringen
                            For $j = $I To $n
                                $a[$k][$j] -= $a[$I][$j] ;die i.zeile von der aktuellen zeile subtrahieren
                            Next
                            $b[$k] -= $b[$I] ;ergebnisse natürlich auch
                        EndIf
                    Next
                    ;_ArrayDisplay($a, "unten1 " & $I)
    
                Next
            EndIf
        Next
    
        ;alle parameter bestimmen durch rückwärtseinsetzen
    
        $Y[$n] = $b[$n]           ;letzter ist bereits bekannt
        For $I = $n - 1 To 0 Step -1
            For $j = $n To $I + 1 Step -1
                $b[$I] -= $a[$I][$j] * $Y[$j]
            Next
            $Y[$I] = $b[$I]
        Next
        Return $Y
    EndFunc                       ;==>_solve_linear_quad
    Exit
    Alles anzeigen

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™