Binary/Whitespace/NullBytes Problemchen

  • Moin Zusammen

    Ich habe einen Wert den ich per UDP von einem Server bekomme.
    Der Wert ist in Hex/Binary.
    In diesem Wert ist ein Whitespace vorhanden mit dem AutoIt überhaupt nich klarkommt.
    Sobald dieses/dieser Whitespace auftaucht ignoriert AutoIt den Rest vom String und macht einfach weiter.
    Am Besten schaut ihr euch das selber an.

    [autoit]

    $binray = "0xFFFFFFFFFFFFFFFFFFFF696E666F302E352E3100756E6E616D65642073657276657200646D3100444D0030002D310030003800"
    $read = FileRead("info.txt")
    MsgBox(0,"Sollte/Ist-Vergleich","ÿÿÿÿÿÿÿÿÿÿinfo0.5.1 unnamed server dm1 DM 0 -1 0 8 " & @CRLF & $read )
    MsgBox(0,"Sollte/Ist-Vergleich","ÿÿÿÿÿÿÿÿÿÿinfo0.5.1 unnamed server dm1 DM 0 -1 0 8 " & @CRLF & BinaryToString($binray))

    [/autoit]


    In der Info.txt seht ihr das alles auch vorhanden ist.
    Die Idee die Whitespaces einfach zu löschen war nicht sehr erfolgreich da es ja anscheinen kein normales/r ist.

    Hoffe mir kann einer bei dem Problemchen helfen

    Mfg Keyle

  • Das sind keine Whitespaces sondern Nullbytes!
    Diese sind und bleiben im String vorhanden, die AutoIt (WinApi)-Funktionen zum Anzeigen stellen aber nur nullterminierte Strings dar! Ergo wird alles "nach" dem Nullbyte "abgeschnitten"....
    Das kann man z.B. damit beheben, indem man das Nullbyte durch ein Leerzeichen austauscht.

    [autoit]

    $binary = "0xFFFFFFFFFFFFFFFFFFFF696E666F302E352E3100756E6E616D65642073657276657200646D3100444D0030002D310030003800"
    $text=BinaryToString($binary) ; ggf. flag anpassen wg Unicode
    $text=stringreplace($text,chr(0)," ") ;Nullbyte ersetzen durch leerzeichen chr(32)
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$text' & @lf & @lf & 'Return:' & @lf & $text) ;### Debug MSGBOX

    [/autoit]


    Um nur die Ascii-Codes 32 bis 127 darzustellen, kann man ja per Regexp() filtern, oder Buchstabenweise den ursprünglichen String scannen...

  • Hier meine Version:

    [autoit]


    #Include <String.au3>
    $soll = "ÿÿÿÿÿÿÿÿÿÿinfo0.5.1 unnamed server dm1 DM 0 -1 0 8 "
    $binray = "0xFFFFFFFFFFFFFFFFFFFF696E666F302E352E3100756E6E616D65642073657276657200646D3100444D0030002D310030003800"
    $filter = "0x" & _StringReverse(StringRegExpReplace(_StringReverse(StringMid($binray, 3)), "(?i)(00)", "02"))
    $ist = BinaryToString($filter)
    ;~ $read = FileRead("info.txt")
    ;~ MsgBox(0,"Sollte/Ist-Vergleich","ÿÿÿÿÿÿÿÿÿÿinfo0.5.1 unnamed server dm1 DM 0 -1 0 8 " & @CRLF & $read)
    MsgBox(0,"Sollte/Ist-Vergleich", $soll & @CRLF & $ist)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯