Буферизация вывода PHP (ob_start, ob_flush)

Раньше я использовал буферизацию вывода php, чтобы создать файл csv из базы данных, потому что я не хотел создавать существующий файл, просто хотел сделать контент загружаемым.

CSV — это текстовый файл, поэтому его легко создать таким образом, вы устанавливаете заголовок и очищаете текстовое содержимое. Но! Что делать, если я хочу создать exe-файл из шестнадцатеричных данных? (Проект таков: у меня есть существующий исполняемый файл, и я хочу, чтобы пользователи могли писать что-то в текстовом поле HTML, и я конвертирую его в шестнадцатеричный формат и заменяю старый текст новым)

Спасибо.


person Iburidu    schedule 01.12.2012    source источник
comment
Знаете ли вы, какой диапазон байтов в exe-файле вы хотите перезаписать?   -  person piotrekkr    schedule 01.12.2012
comment
я делаю. всего около 100-200 байт   -  person Iburidu    schedule 01.12.2012


Ответы (2)


Если вы хотите заменить часть двоичного файла, например, со 100-го байта на 200-й, вы можете использовать substr() и str_pad():

$binFile = file_get_contents('/pathto/exec/file.exec');
$replacedBinFile = substr($binFile, 0, 100) . str_pad(substr($_POST['text'], 0, 100), 100, "\x00") . substr($binFile, 200);
file_put_contents('/pathto/exec/file_replaced.exec', $replacedBinFile);
person piotrekkr    schedule 01.12.2012
comment
и нельзя ли прочитать все шестнадцатеричные данные из моей базы данных (не из exe), и я создаю строку и сбрасываю ее в exe? - person Iburidu; 01.12.2012
comment
Php substr() является двоично-безопасным и работает с байтами, а не с символами. Строка в php также представляет собой последовательность байтов. Так что не имеет значения, откуда у вас данные, если это строка php. Это может быть из базы данных, $_POST, xml, что угодно. Я действительно не понимаю, что вы подразумеваете под шестнадцатеричными данными. Можете ли вы объяснить больше? - person piotrekkr; 02.12.2012

Используйте следующий код для загрузки исполняемого файла путем чтения с жесткого диска.

<?php
$file = 'test.exe';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
person Pankaj Khairnar    schedule 01.12.2012
comment
но это шестнадцатеричный? потому что я должен заменить байты. - person Iburidu; 01.12.2012
comment
теперь у вас есть исполняемый файл, который вы читаете и делаете его загружаемым, НО мне нужно получить шестнадцатеричный контент из исполняемого файла и каким-то образом обменять в нем 100-200 байтов на ДРУГОЙ шестнадцатеричный контент. - person Iburidu; 01.12.2012
comment
вы можете использовать file_get_contents для чтения содержимого файла и замены некоторых из него. Я никогда не пробовал это, но кажется возможным, используя это. - person Pankaj Khairnar; 01.12.2012