Может я что-то пропустил, в новых версиях PHP поменяли обработку mb_strpos ? или ошибка. Короче , код для поиска строки в бинарнике: PHP: $http_sign = mb_convert_encoding('http','UTF-16LE'); $http_replace = mb_convert_encoding('https:','UTF-16LE'); $pos = mb_strpos($data,$http_sign,0,'UTF-16LE'); Не работает, функция возвращает фиг пойми какое смещение. Но зато если заменить на PHP: $pos =strpos($data,$http_sign); все работает. В чем прикол?
непонятно - зачем преобразование кодировки производите в UTF-16LE? бинарник издавно предполагалось что это вообще ASCII без всяких кодировок.. судя по всему так оно у вас и работает
Протестировал на php 7.4 windows, centos. Поиск производился в файле с кодировкой UTF-16LE. Чтение файла $data = file_get_contents('tmpdata.txt'); Текст файла {"callback": "http..."} mb_strpos - смещение соответствует позиции. str_replace - текст заменен корректно. strpos - смещение не соответствует позиции.
Точно, т.к. дальше идет substr_replace. str_replace не сохраняет размер. странно это все. Попробуйте на этом файле, что в аттаче. Поиск все той же строки 'http' в utf-16. Реально она по адресу 0х1E10 , но php почему-то показывает 0xEEB (обычный хелловорлд под win32)
PHP: $data = file_get_contents('1'); $http_sign = mb_convert_encoding('http','UTF-16LE'); $hex = bin2hex($data); $pos2 = mb_strpos($hex, bin2hex($http_sign), 0, 'UTF-16LE'); echo $pos2; 7696
Благодарю. Видимо, это ошибка конкретной версии PHP у меня под виндой. Будем разбираться. p.s. А хотя нет. Я не делал bin2hex , может в этом дело? Только зачем для bin2hex - mb_ дополнение, там же просто текст в ASCII выходит...