Что нового

Поиск бинарных данных по регулярке

dxangelo

Новичок
Сообщения
1
Репутация
0
Здравствуйте всем! Только третий день увлекся программой и пытаюсь автоматизировать для себя некоторые моменты. Столкнулся с такой задачей.
Есть файл ESP, я получаю его данные в бинарном виде (HEX, как я понимаю) и в цикле обрабатываю, ищу конкретные строки, которые начинаются с определенных слов и заканчиваются определенными словами. Вот примерный код, это функция принимающая на входе параметры: путь до файла, массив $searchEsp[3][3] = [['.dds', '.Dds', '.DDS'], ['.tri', '.Tri', '.TRI'], ['.nif', '.Nif', '.NIF']]: - это конечные строки того что я ищу и начальные строки переданные строкой через запятую.
Код:
Func _ReadDataESP($aFile, $aSearch, $dM)
    For $e = 1 To Ubound($aFile, 1) - 1  Step 1    
        $ddMeshes=StringSplit($dM, ',')
        $aeESP = $aFile[$e]
        $binFile = FileOpen($currentDir & $aeESP, 16)
        $binDataFile = StringReplace( FileRead($binFile), "0x", "" )
        FileClose($binFile)
        For $r = 0 To Ubound($aSearch, 1) - 1  Step 1 ; по строкам
            For $c = 0 To Ubound($aSearch, 2) - 1  Step 1 ; по колонкам
                For $d = 1 To $ddMeshes[0]  Step 1
                    $partPath = StringReplace( Binary($ddMeshes[$d]), "0x", "" )
                    $textBinary = StringReplace( Binary( $aSearch[$r][$c] ), "0x", "" )
                    $stringSearch = "\Q" & $partPath & "\E.+?5C.+?\Q" & $textBinary & "\E"
                    $taSearch = StringRegExp( $binDataFile, $stringSearch , 3 );
                    For $t = Ubound($taSearch, 1) - 1 To 0 Step -1
                        If BinaryLen($taSearch[$t]) <= 1000 Then
                            $arrayT = _HexToString($taSearch[$t])
                            $textPathEsp = $arrayT & ";" & $textPathEsp
                            $countPathEsp = $countPathEsp + 1
                            MsgBox(0, $aSearch[$r][$c] & " / " & BinaryLen($taSearch[$t]), $r & " // " & $c & " // " & $d & @CRLF & "Начало: " & $ddMeshes[$d] & " / " & $partPath & @CRLF & "Конец: " & $aSearch[$r][$c] & " / " & $textBinary & @CRLF & $stringSearch & @CRLF & $countPathEsp & @CRLF & "Найдено: " & $textPathEsp)
                        EndIf
                    Next
                Next
            Next
        Next
    Next
EndFunc    ;==>_ReadDataESP

Вот часть файла по которому осуществляю поиск:
54455334680000000000000000000000000000002C000000484544520C009A99D93F90000000B8430000434E414D080044454641554C54004D4153540B00536B7972696D2E65736D0044415441080000000000000000004D4153540B005570646174652E65736D004441544108000000000000000000494E545604000100000047525550901400005458535400000000C324000000000000545853546B00000000000000A7280002000000002C000000454449440D0030304D535465785769673031004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730312E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B000000000000000B2E0002000000002C000000454449440D0030304D535465785769673033004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730332E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B000000000000000C2E0002000000002C000000454449440D0030304D535465785769673034004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730342E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B000000000000000D2E0002000000002C000000454449440D0030304D535465785769673035004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730352E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B000000000000000E2E0002000000002C000000454449440D0030304D535465785769673036004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730362E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B000000000000000F2E0002000000002C000000454449440D0030304D535465785769673037004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730372E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000102E0002000000002C000000454449440D0030304D535465785769673038004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730382E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000112E0002000000002C000000454449440D0030304D535465785769673039004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696730392E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000122E0002000000002C000000454449440D0030304D535465785769673130004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731302E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000132E0002000000002C000000454449440D0030304D535465785769673131004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731312E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000142E0002000000002C000000454449440D0030304D535465785769673132004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731322E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000152E0002000000002C000000454449440D0030304D535465785769673133004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731332E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000162E0002000000002C000000454449440D0030304D535465785769673134004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731342E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00000000000000172E0002000000002C000000454449440D0030304D535465785769673135004F424E440C000000000000000000000000005458303019004D69737479536B79655C776967735C77696731352E646473005458303119004D69737479536B79655C776967735C7769675F6E2E64647300444E414D02000000545853546B00
$stringSearch соответственно сама строка по которой ищу, но результаты которые попадают в выборку иногда совсем не подходят. Как я понимаю у меня ошибка в написании регулярки. Я попытался ограничить по BinaryLen, но мне кажется это не верно, так как размеры очень разные. Кстати если по части файла искать в нотепаде с этой регуляркой "\Q" & $partPath & "\E.+?5C.+?\Q" & $textBinary & "\E" то результаты верные.

К код прошу не критиковать, так как только 3 день открыл для себя AutoIt, а в языках не бум-бум. Если можете подсказать, то будет очень круто!
Сообщение автоматически объединено:

Вопрос решен)
 
Последнее редактирование:
Верх