За последние 24 часа нас посетил 75901 программист и 2996 роботов. Сейчас ищут 1433 программиста ...

Поиск HEX значения в bin файле на разных строках

Тема в разделе "PHP для новичков", создана пользователем rektware, 24 авг 2020.

  1. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Обождите. Я так понял, что строку разбивает символом переноса.
    У вас в примере совсем другое.
     
  2. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    PHP:
    1. $tmp = preg_replace('/\s+/', '', $input);
    2. $result = str_replace($search, $replace, $tmp);
    3. echo $result;
    На одном форуме скинули это, но как использовать
    --- Добавлено ---
    Наверно да, может я не так объясняю
     
  3. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Там вас тоже неправильно поняли
    Точно.
     
  4. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Ну, надеюсь я нашёл человека, который меня понял
     
  5. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Попробуйте просто скопировать те символы в буфер обмена и вставить их в значения массивов выше. после \r\n и \n
     
  6. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Не, бесполезно
     
  7. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Ну, как сможете сформулировать что нужно, пишите.
    Я пока не понял.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.825
    Симпатии:
    1.333
    Адрес:
    Лень
  9. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    А что если сделать так:
    ...[(12...
    ...34)]
    Можно найти значение между [( и )] если они на разных строках?
    --- Добавлено ---
    Вы можете помочь или вы просто просите файл, который я использую? Откройте любой EXE файл в HEX редакторе и вы увидите, что длинные строки переносятся на следующую, если не влазят, так вот как найти целую строку включая ту которая перенеслась на новую
     
  10. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    А почему вы не хотите то же самое сделать каким-нибудь hex редактором?
     
  11. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Мне надо на PHP
    Для автоматизации так сказать.. Не буду же я постоянно лезть в HEX редактор, чтобы что-то изменить в файле.
     
    #36 rektware, 25 авг 2020
    Последнее редактирование: 25 авг 2020
  12. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Видите-ли, найти, по большому счету все искомые варианты разрыва искомой строки не так уж и сложно.
    Проблема заменить её на строку замены, с тем же набором разделяющих символов.
    Тоже, в принципе решаемо. Но скрипт потребует отладки. Буквально на каждом шагу.
    Дистанционно я вряд ли смогу чем-то вам помочь.
     
  13. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Ладно, спасибо. Можно в принципе по одному символу заменять, но будет ломаться файл, потому что он найдёт все похожие символы и заменит.. Крч не знаю.
    --- Добавлено ---
    Хотя вроде-бы нашел рабочее решение методом перебора всего подряд.
     
  14. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Алгоритм примерно следующий.
    Найти все вхождения искомой строки с разрывом управляющими символами после первой цифры искомого числа. Они будут в виде массива.
    Перебрать их с заменой только одного символа(последнего в вашем примере) в отдельный массив.
    И оба массива передать функции preg_replace()
    Повторить для следующей комбинации, и дальше.
    Как-то так.
     
    rektware нравится это.
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Вариант:
    PHP:
    1. // возможные варианты разделения, для демонстрации.
    2. $arr = ['71647A59',
    3. <<< EOT
    4. 71647A
    5. 59
    6. EOT,
    7. <<< EOT
    8. 7164
    9. 7A59
    10. EOT,
    11. <<< EOT
    12. 71
    13. 647A59
    14. EOT,
    15. ];
    16. //$pattern = '~71(\n*)64(\n*)7A(\n*)59~m'; // шаблон проверки
    17. $replacement_pieces = str_split('71647A58', 2);
    18. foreach ($arr as $subject) {
    19.     $str = str_replace("\n", '', $subject);
    20.     $pieces = str_split($str, 2);
    21.     $pattern = '~' . implode('(\n?)', $pieces) . '~';
    22.     $matches = [];
    23.     $foo = preg_match($pattern, $subject, $matches);
    24.     $replacement = reset($replacement_pieces);
    25.     for($i = 1, $cnt = count($matches); $i < $cnt; $i++) {
    26.         if(strlen($matches[$i])) {
    27.             $replacement .= "\n";
    28.         }
    29.         $replacement .= next($replacement_pieces);
    30.     }
    31.     var_dump("subj: $subject, pattern: $pattern, replacement: $replacement");
    32. }
    ?
     
    rektware нравится это.
  16. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Можешь это в мой пример засунуть? А то я не очень хорошо понимаю PHP, ты так много написал
    Он на первой странице вначале темы
     
  17. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    PHP:
    1. $raw = file_get_contents('1.bin');
    2. $hex = bin2hex($raw);
    3. $hex_new = '71647A58';
    4. $hex = replace_hex_with_nl($hex, $hex_new);
    5. $raw = hex2bin($hex);
    6. file_put_contents('1.bin', $raw);
    7.  
    8. function replace_hex_with_nl($subject, $replacement) {
    9.     $replacement_pieces = str_split($replacement, 2);
    10.     $str = str_replace("\n", '', $subject);
    11.     $pieces = str_split($str, 2);
    12.     $pattern = '~' . implode('(\n?)', $pieces) . '~';
    13.     $matches = [];
    14.     $foo = preg_match($pattern, $subject, $matches);
    15.     $replacement = reset($replacement_pieces);
    16.     for($i = 1, $cnt = count($matches); $i < $cnt; $i++) {
    17.         if(strlen($matches[$i])) {
    18.             $replacement .= "\n";
    19.         }
    20.         $replacement .= next($replacement_pieces);
    21.     }
    22.     return $replacement;
    23. }
     
    rektware нравится это.
  18. rektware

    rektware Активный пользователь

    С нами с:
    18 янв 2018
    Сообщения:
    23
    Симпатии:
    0
    Вот только куда пропала заменяемая строка? Мне надо не весь файл переведённый в HEX заменить, а одну строку в нем
    71647A59 эту строку на эту 71647A58
     
  19. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Да, о чём-то не о том думал, когда составлял алгоритм :)
    Вот:
    PHP:
    1. $raw = file_get_contents('1.bin');
    2. $hex = bin2hex($raw);
    3. $subject = '71647A59';
    4. $replacement = '71647A58';
    5. $replacement_info = getReplacementInfo($subject, $replacement);
    6. $hex = preg_replace($replacement_info['pattern'], $replacement_info['repl'], $hex);
    7. $raw = hex2bin($hex);
    8. file_put_contents('1.bin', $raw);
    9.  
    10. function getReplacementInfo($subject, $replacement)
    11. {
    12.   $subject_pieces = str_split($subject, 2);
    13.   $replacement_pieces = str_split($replacement, 2);
    14.   $aResult = [];
    15.   for ($i = 0, $cnt = count($subject_pieces); $i < $cnt; $i++) {
    16.   for ($j = 0; $j < $cnt; $j++) {
    17.   if (isset($aResult['pattern'][$j])) {
    18.   $aResult['pattern'][$j] .= $subject_pieces[$i];
    19.   } else {
    20.   $aResult['pattern'][$j] = "/" . $subject_pieces[$i];
    21.   }
    22.   if (isset($aResult['repl'][$j])) {
    23.   $aResult['repl'][$j] .= $replacement_pieces[$i];
    24.   } else {
    25.   $aResult['repl'][$j] = $subject_pieces[$i];
    26.   }
    27.   if ($j == $i + 1) {
    28.   $aResult['pattern'][$j] .= "\n";
    29.   $aResult['repl'][$j] .= "\n";
    30.   }
    31.   if ($i == $cnt - 1) {
    32.   $aResult['pattern'][$j] .=  "/";
    33.   }
    34.   }
    35.   }
    36.   return $aResult;
    37. }
     
    rektware нравится это.