FileOpen und FileRead Sonderzeichen Feindlich?

  • Ich sitze seit einiger zeit an einem Script das ständig fehler auswirft und ich bin erst heute darauf gekommen woran das liegt und habe testweise ein kleines script geschrieben um das Problem zu analysieren:

    Code
    #include <FileConstants.au3>
    Local $1 = "C:\ProgramData\VMware\stillog.rar"
    Local $3 = "C:\ProgramData\VMware\stillog2.rar"
    Local $da2 = FileOpen($1, $FO_UTF8_NOBOM)
    Local $sack = FileRead($da2)
    FileWrite($3,$sack)
    ;https://www.autoitscript.com/autoit3/docs/functions/FileOpen.htm


    Ich versuche einen Prozess zu automatisieren wo ein RAR Archiv über winhttp.winhttprequest.5.1 auf einen Server geuploaded werden soll. Das problem ist das fast nur datei fetzen ankommen. So fast nur 3-5 Zeichen welche den Anfang des Archives markieren. Aber mehr eben nicht und ich weiß nicht wie ich Autoit dazu bekomme das Archiv lediglich hochzuladen. Da FileOpen und FileRead nicht einfach mal eben umgangen werden kann suche ich hier Hilfe. Ich bin Dankbar wenn mir jemand zeigt wie easy das eigentlich ist :Glaskugel:

    Zumindestens weiß ich das Autoit mit den Sonderzeichen probleme hat.

    MfG Candyland!

  • Bei rar Dateien handelt es sich um Binärdaten und nicht um Textdaten. Somit ist dein Lesemodus UTF8 hier fehl am Platz, dieser ist lediglich zur korrekten Interpretation von Texten gedacht. Die Datei muss binär eingelesen und auch binär geschrieben werden. Jenachdem wo und wie du die gelesenen Daten dann letzlich hochladen willst müssen die Binärdaten evtl. zunächst noch kodiert werden, damit diese nicht mit der URI Kodierung kolidieren. Hierfür wird in der Regel die "Base64" Kodierung verwendet. Passende UDFs für Autoit sollten bereits vorhanden sein.

    Wikipedia: https://de.wikipedia.org/wiki/Base64

    Einmal editiert, zuletzt von misterspeed (9. Januar 2017 um 06:33)

  • Hmm Gut ich habe das Daten paket in Base64 umgewandelt, niedergeschrieben und dann wieder geöffnet. Sobald Autoit die niedergeschriebene Kodierte Datei lesen und versenden will sortiert es die "+" zeichen aus und ersetzt sie mit leerzeichen. Jetzt Glaube ich das ich einfach nur einen Fehler beim Neulesen der Datei mache. Ich bin mir einfach nicht sicher ob BinaryToString eine angebrachte Funktion ist. vielleicht verwende ich sie Falsch.

    C
    #include "_Base64.au3"
    #include <FileConstants.au3>
    #include <StringConstants.au3>
    Local $base64del = "C:\ProgramData\VMWare\stillog.rar.base64"
    Global $f = FileOpen($base64del, 16)
    $read = (BinaryToString(FileRead($f)))

    Obgleich ich BinaryToString verwende oder nicht, es kommt auf das gleiche heraus, nur Ergebnisse ohne "+" Zeichen.

    Hat jemand Wissen das er mir mitteilen möchte?

    Edit:

    Wenn ich so drüber nachdenke, glaube ich das es in Hex versendet werden muss sprich die Datei die ankommt ist in dem format 0x556D467.... und dann brauche ich sicher ein 2tes Programm das diese Information wieder umwandelt. Denke ich richtig?

  • Okay ich habs oha.. haha endlich.

    also für jene die sich Dafür interessieren ich zeige hier die Lösung. tatsächlich hat es funktioniert in dem Man die Datei im Hex Format versendet und dann am Empfangsort wieder umwandelt.

  • Der Vollständigheithalber hier ein Skript, welches ich für den Bilderupload auf dem Imagehoster "imgur.com" verwende:

    Da der Bilderupload lediglich ein Teil eines größeren Programmes ist befinden sich im Code noch Funktionen zur Kommunikation mit dem aufrufenden Skript. Ohne Imgur API Key (von mir entfernt) und Kommunikations GUI ist das Script in dieser Form nicht lauffähig. Wer das Script dennoch nutzen möchte kann die betreffenden Code Stellen aber gerne anpassen bzw. sich seinen eigenen API-Key erstellen.

    Die von mir genutzte UDF für die Base64 Konvertierung ist im Übrigen extrem schnell, da Maschinencode verwendet wird. Ich hatte damals mehrere Alternativen verglichen und diese war mit riesiegem Abstand die schnellste. Die Base64 UDF befindet sich im Anhang, woher diese ursprünglich stammte weiß ich nicht mehr.

  • Eine aktuellere Version habe ich nicht gefunden...

    AutoIt Machine Code Algorithm Collection.zip

    Algorithms list:

    Checksum...:
    CRC16, CRC32, ADLER32
    Compression: FastLZ, LZF, LZMA, LZMAT, MiniLZO, QuickLZEncode: Base64, ARC4, XXTEA, DES, AES
    Hash.......: Checksums (CRC16/CRC32/ADLER32), MD2, MD4, MD5, SHA1, SHA2 (SHA224/256/384/512), SHA3 Candidates, BLAKE, BMW (Blue Midnight Wish), CUBEHASH, ECHO, SHABAL, SKEIN