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?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Нужна помощь при работе с бинарными данными на Linux и Windows
Aljnk
Отправлено: 24 Июля, 2012 - 11:13:35
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Добрый день.
Столкнулся с такой проблемой - есть функция, которая работает с бинарными данными загружаемого файла.
CODE (htmlphp):
скопировать код в буфер обмена
  1. myFunction(fread(fopen($fileway, "rb"), filesize($fileway)));

Создавал и тестировал функцию на Windows. Но когда закинул ее на Linux хостинг, оказалось, что при чтении файла через fopen ->fread бинарные данные на Linux получаются другие. В частности, вместо \х0 выдает \0, а вместо ' выдает ''. После того как поменял одно на другое все заработало. Но я тестировал лишь один файл, а их может быть много разных и возможно обнаружатся еще несоответствия. Информацию о таких различиях я нигде не нашел. Подскажите, кто знает, где можно найти такую информацию? Или возможно есть php функции или способы избежать подобной проблемы?
Спасибо.

(Отредактировано автором: 24 Июля, 2012 - 11:14:33)

 
 Top
Мелкий Супермодератор
Отправлено: 24 Июля, 2012 - 11:36:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Используйте file_get_contents. Во всяком случае открытый дескриптор файла висеть не будет.


-----
PostgreSQL DBA
 
 Top
Aljnk
Отправлено: 24 Июля, 2012 - 11:49:02
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




file_get_contents не подходит - ничего не меняется.
CODE (htmlphp):
скопировать код в буфер обмена
  1.    echo $txt; //Windows выдает - dx\x0Bl'...
  2.    echo $txt; //Linux выдает - dx\0Bl''...

а для меня важно чтоб эти данные были одинаковы.

(Отредактировано автором: 24 Июля, 2012 - 11:49:24)

 
 Top
Мелкий Супермодератор
Отправлено: 24 Июля, 2012 - 12:14:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Эм. А с чего вы взяли, что визуальное представление двух бинарников будет идентичным? Сверяйте хотя бы 16-ый вид.


-----
PostgreSQL DBA
 
 Top
Aljnk
Отправлено: 24 Июля, 2012 - 12:36:18
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Мелкий пишет:
А с чего вы взяли, что визуальное представление двух бинарников будет идентичным?

Ну как бы файл то один и тот же и символы те же самые. Просто в случае windows, file_get_contents записывает этот конкретный символ как \х0, а Linux выдает как \0. Самое интересное в том, что если перезаписать файл –
CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = fread(fopen($fileway, "rb"), filesize($fileway));
  2. fwrite(fopen(" file.txt", "wb"), $file);

то в Windows получится точно такой же файл, а в Linux - не получается.
 
 Top
Aljnk
Отправлено: 30 Июля, 2012 - 14:15:52
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Че, реально никто не знает почему на Linux
CODE (htmlphp):
скопировать код в буфер обмена
  1. $file = fread(fopen($fileway, "rb"), filesize($fileway));
  2. fwrite(fopen(" file.txt", "wb"), $file);

не получается тот же самый файл?
Может хоть идеи какие есть? За что зацепиться?
 
 Top
Stierus Супермодератор
Отправлено: 03 Августа, 2012 - 10:19:40
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




первое - шестнадцатиричное представление, второе - восьмеричное, скорее всего
 
My status
 Top
Aljnk
Отправлено: 03 Августа, 2012 - 10:27:57
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




А как сделать чтоб и там и там было одинаково?
 
 Top
Stierus Супермодератор
Отправлено: 03 Августа, 2012 - 10:48:03
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Что бы посмотреть двоичный файл (сравниваем побитово):

PHP:
скопировать код в буфер обмена
  1. $filePath = 'path_to_file';
  2. $handle = fopen($filePath, 'rb');
  3. $fsize = filesize($filePath);
  4. $contents = fread($handle, $fsize);
  5. fclose($handle);
  6.  
  7. $odata = '';
  8. for($i = 0; $i < $fsize; $i++)
  9. {
  10.    $asciiCharacter = $contents[$i];
  11.    $base10value = ord($asciiCharacter);
  12.    $base2representation = base_convert($base10value, 10, 2);
  13.    $odata .= $base2representation;
  14. }
  15.  
  16. printf($odata);



ps
Тебе нужно понять, в каких местах идут расхождения - выложить файл и сказать, какие символы обрабатываются по-разному (не в двоичном виде, base64encode, например)
 
My status
 Top
Aljnk
Отправлено: 03 Августа, 2012 - 13:21:33
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Такой код не поможет. Дело в том, что после fopen ->fread в переменную уже записан неправельный вариант. Повторю код:
CODE (htmlphp):
скопировать код в буфер обмена
  1.    echo $txt; //Windows выдает - dx\x0Bl'...
  2.    echo $txt; //Linux выдает - dx\0Bl''...

Так вот в 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 рисунок не востанавливается.

Другие кодировки не пробовал. Пока не думал над этим, но так с ходу не совсем понятно как я потом смогу к байтам перейти? А это важно - ведь моя функция ищет конкретные комбинации байтов и преобразовывает их.
 
 Top
Stierus Супермодератор
Отправлено: 06 Августа, 2012 - 13:22:33
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Выложи сюда архив, в архиве: файл из винды, тот же файл из линукса, скрипт, которым открываешь.

зы
попробуй обновить пых, возможно, это бага в нем
 
My status
 Top
Aljnk
Отправлено: 06 Августа, 2012 - 15:06:27
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Скидываю архив со всем, что просили...
Как я заметил проблема возникает только с теми файлами у которых изначально есть перечисленные мной последовательности. То есть, если в открытом на Windows файле есть \0 или '', то для Windows это не проблема. А при открытии на Linux появляются такие же последовательности вместо \x0 и '. И он их не различает...

Если я вас правельно понял, то пых это php? Обновить его нет возможности, так как проблемы с тем php, который у моего хостера. Если у вас на Linux все будет работать нормально, то прийдется общатся с хостером Улыбка
Скачать файл: test.rar
Скачан раз: 88

(Отредактировано автором: 06 Августа, 2012 - 15:07:18)

 
 Top
Stierus Супермодератор
Отправлено: 06 Августа, 2012 - 15:10:59
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




вечером посмотрю
 
My status
 Top
Aljnk
Отправлено: 22 Августа, 2012 - 18:35:46
Post Id



Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Март 2011  
Откуда: Москва


Помог: 0 раз(а)




Ну, как результат? Это у меня глючит или у вас то же самое?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB