_ArrayToStringEx

  • Moin,

    Wer schonmal die Standardversion von _ArrayToString benutzt hat weiß, dass diese Funktion extrem schnell an ihre Grenzen stößt.
    Eine vollständige Rekonstruktion eines Arrays ist nur möglich, wenn das komplette Array ausschließlich Strings enthält die jeweils NICHT den Seperator enthalten. Im Prinzip also ein Spezialfall eines Spezialfalls einer allgemeinen Anwendung.

    Was kann ArrayToStringEx ?
    Es kann genau das was der Name vermuten lässt, es verwandelt ein (relativ) beliebiges Array in einen String. Mit der Umkehrfunktion _StringToArrayEx lässt sich dieses Array wieder vollständig aus dem String rekonstruieren. Dabei werden fast alle in AutoIt möglichen Datentypen ebenfalls wiederhergestellt.

    Sie kann ein 1D oder 2D Array vollständig in einen String umwandeln. Der String liegt als Base256 vor, falls man ihn "ansehen" will sollte man also ein StringToBinary zwischenschalten.
    Unterstützt wird fast alles, daher zähle ich die Sachen auf die nicht unterstützt werden:

    • Arrays mit einer Dimension höher als 2 (also 3D, 4D, usw)
    • Der Map Variablentyp (der wird noch nachgeliefert, sobald Maps in der Stable vertreten sind und ich genug Lust habe weiterzubasteln)
    • DllStructs (Es gibt das Problem, dass der interne Aufbau einer Struct im nachhinein nicht mehr ermittelt werden kann. Eine Struct lässt sich z.B. assoziativ herrichten, sodass man zur Rekonstruktion einer Struct den vollständigen String benötigt der DllStructCreate übergeben wurde)
    • Objekte (Sind von Natur aus nicht Zeitunabhängig und beinhalten Verzweigungen im RAM die nicht "allgemein" erfassbar sind. Daher ist es unmöglich Objekte zu "speichern")

    Edit: 16.Aug.15 (AutoIt 3.3.12.0)
    Es gibt einige kleine Erneuerungen.

    • Neuer unterstützer Datentyp: "Datei" -> Es können nun auch Dateien (via Dateiname in einem Array) mittels ArrayToStringEx in einen String gepackt werden. Im Ergebnis von StringToArrayEx ist dann allerdings der Dateiinhalt, es werden also keine neuen Dateien angelegt. Damit lässt sich ArrayToString auch als Containerformat für Dateien verwenden.
    • Neuer unterstützer Datentyp: "GDIPlus Bitmap" -> Klingt komisch, ist aber so. Man kann jetzt z.B. ein Array aus GDI+ Bitmaps/Images als String speichern und später wieder laden. Damit lässt sich ArrayToString auch als Containerformat für viele (kleine) GDI+ Bilder nutzen.
    • Das Zu- und Abschalten dieser Möglichkeiten wird mit _ArrayToStringOpt vorgenommen (hier werden in Zukunft ggf. noch weitere Einstellungsmöglichkeiten folgen).

    Edit: 07.Feb.23 (AutoIt 3.3.16.1)

    Bugfixes.

    • Das Speicher von GDI+ Bildern hat (vermutlich seit einigen Jahren) nicht mehr funktioniert, da irgendwo irgendetwas bei FileRead, oder der Handhabung vom Binary Datentyp geändert wurde.
    • UserFunction hat als Datentyp nicht funktioniert.
    • AspirinJunkie hat eine standadisierte Methode verwendet die dasselbe kann (aber vermutlich besser ist) angewendet um eine UDF zu schreiben. Außerdem wird der Map Datentyp unterstützt (weshalb ich das hier nicht hinzufüge, Sachen mehrfach zu machen bringt ja nichts). CBOR-UDF

    Die Funktion ist ausdrücklich NICHT auf geringe Stringgröße optimiert, der Output besitzt idr eine hohe Redundanz und Komprimierbarkeit. (Hier könnte man die in UEZ' B64-Skript verwendete LZ-Funktion benutzen)
    Falls Fehler, Anregungen, Vorschläge auftauchen, so lasst es mich wissen  ;)

    lg
    M