Problem mit BinaryToString

  • Hallo,

    ich habe ein Problem mit diesem Skript:

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <Array.au3>

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

    Global $bStream = Binary("0x5c00fd4000020000002b00000014000000000091062f00020000025f0d000000000e180520820f195003005c00fa760002000000380000002b00000000008e0624434f4e4649470002000001f80d0f9100000e140120050f10152900020000025f06005c00fab10002000000380000003800000000008e06244f46464943450002000001cf0d009100000e140120050f10152900020000045706005c00fa840002000000380000003800000000008e062453595354454d0002000000e80d0b9100000e140120050f10152900020000062606005c00fa290000000000390000003800000000008e0644454c5f50524f470002000007420d029100000e130120120f1527220002000a753206005c00faa70000000000340000003900000000008e064d41430002000008d60d0a9100000e111120810f2155000002000a3e5806005c00fb250000000000340000003400000000008e06504c430002000006400d009100000e181120810f2156340002000a472e06005c00fa670000000000350000003400000000008e0650524f470002000001ed0d029100000e120120120f1259390002000a4d6e06005c00f9450000000000390000003500000000008e065445535450524f470002000001fe0d009100000e100120830f2137100002000a500606005c00fba60000000000350000003900000000008e065459504500020000090f0d009100000e120120120f1239480002000a520406005c00fb120000000000340000003500000000008e0656415200020000011a0d019100000e010120800f0036410002000a62a106005c00ff1e00020000001400000034000000000097")

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

    If StringInStr(BinaryToString($bStream), BinaryToString("0x8E06")) Then MsgBox(0, "", "gefunden")

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

    $aFolder = _StringBetween(BinaryToString($bStream), BinaryToString("0x8E06"), BinaryToString("0x0002"))
    _ArrayDisplay($aFolder)

    [/autoit]

    Warum kann er bei dem StringInStr den Teilstring finden aber vom _StringBetween bekomme ich kein leeres Array zurück?

    4 Mal editiert, zuletzt von m-obi (7. März 2012 um 13:45)

  • Wenn ich mir deine Binärdaten ansehe sehe ich das auf alle 8E06 immer direkt eine 2 folgt. Und "0x0002" ist nunmal: 2
    Also macht er ja alles richtig - zwischen 08E06 und 2 steht immer nichts - also kann nur nichts als Ergebnis kommen.

  • Aber ein bisschen weiter kommt dann 0002. Welcher mein zweiter Delim ist. Also das Ende. Wie kann ich dann das machen?

  • Die regulären Ausdrücke in _StringBetween kommen nicht mit Chr(0) zurecht. Wenn du es so anpasst, funktioniert es:

    Spoiler anzeigen
    [autoit]


    Func _MyStringBetween($s_String, $s_Start, $s_End, $v_Case = -1)

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

    ; Set case type
    Local $s_case = ""
    If $v_Case = Default Or $v_Case = -1 Then $s_case = "(?i)"

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

    ; Escape characters
    Local $s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\|\0)" ; <== zusätzlich |\0
    $s_Start = StringRegExpReplace($s_Start, $s_pattern_escape, "\\$1")
    $s_End = StringRegExpReplace($s_End, $s_pattern_escape, "\\$1")

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

    ; If you want data from beginning then replace blank start with beginning of string
    If $s_Start = "" Then $s_Start = "\A"

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

    ; If you want data from a start to an end then replace blank with end of string
    If $s_End = "" Then $s_End = "\z"

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

    Local $a_ret = StringRegExp($s_String, "(?s)" & $s_case & $s_Start & "(.*?)" & $s_End, 3)

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

    If @error Then Return SetError(1, 0, 0)
    Return $a_ret
    EndFunc ;==>_StringBetween

    [/autoit]
  • Hab doch nochwas.
    Wieso kommt hier 17 raus? Ist 0xA021 nicht Binary??

    [autoit]

    $bTest = 0xA021

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

    For $i = 0 To 1
    $bTest &= Binary("0x4545")
    Next

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

    ConsoleWrite(BinaryLen($bTest) & @CRLF)

    [/autoit]
  • $bTest ist ein Integer, an das hängst du per &= eine binäre Variable an. als Ergebnis erhälst du einen String. Das binäre Anhängen funktioniert nur mit binären Variablen.

    [autoit]

    $bTest = Binary("0xA021")

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

    For $i = 0 To 1
    $bTest &= Binary("0x4545")
    Next

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

    ConsoleWrite(BinaryLen($bTest) & @CRLF)

    [/autoit]
  • Achso ich dachte wenn man ein 0x vorhängt ist es automatisch Binary. Hab vorher noch nix mit Binary gemacht. Danke.

  • Und wenn ich dann von TCPRecv Binärdaten bekomme, muss ich dannoch das Binary() vorsetzen?

    Also:

    [autoit]

    $bStream = Binary(TCPRecv($iSocket, 1460, 1))

    [/autoit]

    Weil es ja nur ein Binärstring ist, aber kein Binary.

  • Wenn du TCPRecv mit Binärflag aufrufst, bekommst du auch den Rückgabetyp Binary, also musst du es nicht verwenden.