За последние 24 часа нас посетили 88894 программиста и 4481 робот. Сейчас ищут 2160 программистов ...

mb_strpos некоректный результат?

Тема в разделе "PHP для профи", создана пользователем zer0day, 7 янв 2024.

  1. zer0day

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

    С нами с:
    15 ноя 2019
    Сообщения:
    21
    Симпатии:
    0
    Может я что-то пропустил, в новых версиях PHP поменяли обработку mb_strpos ? или ошибка. Короче , код для поиска строки в бинарнике:

    PHP:
    1. $http_sign = mb_convert_encoding('http','UTF-16LE');
    2.     $http_replace = mb_convert_encoding('https:','UTF-16LE');
    3.     $pos = mb_strpos($data,$http_sign,0,'UTF-16LE');
    4.    
    Не работает, функция возвращает фиг пойми какое смещение. Но зато если заменить на

    PHP:
    1. $pos =strpos($data,$http_sign);
    все работает. В чем прикол?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    756
    Адрес:
    Татарстан
    В каком месте это бинарник?
    В целом - дело в кодировках, mb_ для работы с utf8 обычно
     
    #2 ADSoft, 7 янв 2024
    Последнее редактирование: 7 янв 2024
    MouseZver нравится это.
  3. zer0day

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

    С нами с:
    15 ноя 2019
    Сообщения:
    21
    Симпатии:
    0
    в $data данные бинарника
    а для utf-16 что?
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    756
    Адрес:
    Татарстан
    непонятно - зачем преобразование кодировки производите в UTF-16LE?
    бинарник издавно предполагалось что это вообще ASCII без всяких кодировок.. судя по всему так оно у вас и работает
     
  5. zer0day

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

    С нами с:
    15 ноя 2019
    Сообщения:
    21
    Симпатии:
    0
    В бинарнике строка в utf-16, нужно найти ее и заменить на другую.
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    Кстати, там точно strpos, а не str_replace нужен?
     
  7. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Протестировал на php 7.4 windows, centos. Поиск производился в файле с кодировкой
    UTF-16LE. Чтение файла $data = file_get_contents('tmpdata.txt');
    Текст файла
    {"callback": "http..."}
    mb_strpos - смещение соответствует позиции.
    str_replace - текст заменен корректно.
    strpos - смещение не соответствует позиции.
     
    #7 Aleksandr.B, 9 янв 2024
    Последнее редактирование: 9 янв 2024
  8. zer0day

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

    С нами с:
    15 ноя 2019
    Сообщения:
    21
    Симпатии:
    0
    Точно, т.к. дальше идет substr_replace. str_replace не сохраняет размер.
    странно это все. Попробуйте на этом файле, что в аттаче. Поиск все той же строки 'http' в utf-16. Реально она по адресу 0х1E10 , но php почему-то показывает 0xEEB
    (обычный хелловорлд под win32)
     

    Вложения:

    • 1.zip
      Размер файла:
      84,1 КБ
      Просмотров:
      3
  9. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
  10. zer0day

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

    С нами с:
    15 ноя 2019
    Сообщения:
    21
    Симпатии:
    0
    Благодарю. Видимо, это ошибка конкретной версии PHP у меня под виндой. Будем разбираться.

    p.s. А хотя нет. Я не делал bin2hex , может в этом дело? Только зачем для bin2hex - mb_ дополнение, там же просто текст в ASCII выходит...