Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Чем отличается работа fopen + fread на Linux и Windows?
Создавал и тестировал функцию на Windows. Но когда закинул ее на Linux хостинг, оказалось, что при чтении файла через fopen ->fread бинарные данные на Linux получаются другие. В частности, вместо \х0 выдает \0, а вместо ' выдает ''. После того как поменял одно на другое все заработало. Но я тестировал лишь один файл, а их может быть много разных и возможно обнаружатся еще несоответствия. Информацию о таких различиях я нигде не нашел. Подскажите, кто знает, где можно найти такую информацию? Или возможно есть php функции или способы избежать подобной проблемы?
Спасибо.
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Эм. А с чего вы взяли, что визуальное представление двух бинарников будет идентичным? Сверяйте хотя бы 16-ый вид.
----- PostgreSQL DBA
Aljnk
Отправлено: 24 Июля, 2012 - 12:36:18
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011 Откуда: Москва
Помог: 0 раз(а)
Мелкий пишет:
А с чего вы взяли, что визуальное представление двух бинарников будет идентичным?
Ну как бы файл то один и тот же и символы те же самые. Просто в случае windows, file_get_contents записывает этот конкретный символ как \х0, а Linux выдает как \0. Самое интересное в том, что если перезаписать файл –
ps
Тебе нужно понять, в каких местах идут расхождения - выложить файл и сказать, какие символы обрабатываются по-разному (не в двоичном виде, base64encode, например)
Aljnk
Отправлено: 03 Августа, 2012 - 13:21:33
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011 Откуда: Москва
Помог: 0 раз(а)
Такой код не поможет. Дело в том, что после fopen ->fread в переменную уже записан неправельный вариант. Повторю код:
Так вот в Windows $contents[2] == "\x0" и $contents[3] == "B"
А на Linux получается $contents[2] == "\" и $contents[3] == "0"
То есть мало того, что он неправельно отдает символы, так он из 1 символа делает 2.
Я пробовал делать replace, но неправельный "\0" и совершенно правельные 2 символа идущие подряд "\" и "0" он не различает и спокойно меняет. Если в файле нет естественных "\" и "0" идущих подряд, то после замены получается корректный файл. А если есть, то замена не помогает.
Файл - любой рисунок. После $img=fopen ->fread => fopen ->fwrite( ,$img) на Linux рисунок не востанавливается.
Другие кодировки не пробовал. Пока не думал над этим, но так с ходу не совсем понятно как я потом смогу к байтам перейти? А это важно - ведь моя функция ищет конкретные комбинации байтов и преобразовывает их.
Stierus
Отправлено: 06 Августа, 2012 - 13:22:33
Рекордсмен по количеству сообщений за 7 дней
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Выложи сюда архив, в архиве: файл из винды, тот же файл из линукса, скрипт, которым открываешь.
зы
попробуй обновить пых, возможно, это бага в нем
Aljnk
Отправлено: 06 Августа, 2012 - 15:06:27
Новичок
Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011 Откуда: Москва
Помог: 0 раз(а)
Скидываю архив со всем, что просили...
Как я заметил проблема возникает только с теми файлами у которых изначально есть перечисленные мной последовательности. То есть, если в открытом на Windows файле есть \0 или '', то для Windows это не проблема. А при открытии на Linux появляются такие же последовательности вместо \x0 и '. И он их не различает...
Если я вас правельно понял, то пых это php? Обновить его нет возможности, так как проблемы с тем php, который у моего хостера. Если у вас на Linux все будет работать нормально, то прийдется общатся с хостером
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.