Я просто делаю небольшую PHP-программу / страницу для удовольствия. Моя конечная цель – позволить себе загрузить файл изображения в мою базу данных mysql. Затем вызовите этот файл в строку в ASCII, а затем вырежьте этот файл для созданного файла JPG.
Чтобы проверить это, я использовал программу FTK Imager вместе с моим веб-сервером, и результаты были менее чем непригодными. Конечно, я довольно новичок в PHP, поэтому я знаю, что, вероятно, есть много вещей, о которых я не знаю, что я делаю неправильно. Поэтому я надеялся получить несколько указателей 🙂
Моя процедура. Создайте и НЕОБХОДИМО использовать файл изображения ad1 с помощью FTK Imager. Я создал образ каталога, содержащего несколько файлов. .docx, .pdf, .jpeg и т. д. Затем я добавил этот файл изображения в свой каталог webservers вместе со своей тестовой страницей. Затем я вызывал страницу через окно браузера.
Я был встречен синглом 6. Это был мой результат, 6. Я попытался сделать эхо некоторую ошибку на этом пути, поскольку код выполняется вместе с некоторыми сообщениями об ошибках и, насколько я могу судить, $ soff не получает предназначенное по той или иной причине (точное значение не имеет значения).
Почему бы не получить правильное значение? Я знаю, что это правильные подписи ASCII Header / Trailer.
Вот мой скрипт с включенными эхо-сигналами и ошибками.
<?php ini_set('display_errors',1); error_reporting(E_ALL); // Search Criterium $jpgs = "ÿØÿà"; echo "yoya Start<br />" . $jpgs; $jpgeoff = "702"; echo "<br />" . $jpgeoff; $jpge = "ÿÙ"; echo "<br />" . $jpge; // Input file to string $ipfile = file_get_contents('testimage.ad1'); // Input file length for math $m1 = strlen($ipfile); echo "<br />" . $m1; // Check for empty file if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; } // Set starting offset with first criterium find $soff = strpos($ipfile, $jpgs); echo "<br />" . $soff; // Do math to find where to start substr to cut first part off beginning of string. $x1 = ($soff - 1); echo "<br />" . $x1; $x2 = ($m1 - $soff); echo "<br />" . $x2; // Execute the final math into cuts. $ipfile = substr($ipfile, $x1, $x2); // New input file length for more math. $m2 = strlen($ipfile); echo "<br />" . $m2; // Set ending offset with jpgeoff to skip false positives for jpegs, then jpge to find real trailer character. $eoff = strpos($ipfile, $jpge, $jpgeoff); echo "<br />" . $eoff; // Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off. $y1 = "0"; echo "<br />" . $y1; $y2 = ($eoff + 1); echo "<br />" . $y2; // Execute the final math into cuts. $ipfile = substr($ipfile, $y1, $y2); // The $ipfile string should now contain the ASCII string of only the JPG file. echo $ipfile; ?>
Вот результат в моем веб-браузере.
yoya Start ÿØÿà 702 ÿÙ 16542148 -1 16542148 1 Warning: strpos() [function.strpos]: Offset not contained in string in /var/www/html/test1.php on line 32 0 16
Я ссылался на свою информацию о подписи файла отсюда http://www.garykessler.net/library/file_sigs.html и проверил это, просмотрев мои файлы jpg в FTK Imager.
Лучше всего я могу понять, что есть другой способ, которым я должен рассказывать сценарию, чтобы найти смещения информации заголовка / подписи на моем изображении.
Любая информация очень приветствуется! Это просто для удовольствия и обучения.
Спасибо 🙂
EDIT – 7/22
Я работал над своим кодом и продолжал. Я сделал некоторые изменения, чтобы лучше отражать структуру файла JPEG, когда он просматривается в шестнадцатеричном виде, и это то, что я буду искать. Я запускаю одну ошибку, кажется, что strpos не «видит» 0? Моя программа возвращается почти по результатам, заголовки и все отлично смотрятся, но strpos или что-то … находит ложное позитивное в этих точках в шестнадцатеричном файле jpeg …
Он читает FFD9 с каждой стороны этих двух нулей, когда мне нужен FFD9 рядом с eachother …
Вот мой обновленный код,
<?php ini_set('display_errors',1); error_reporting(E_ALL); // HEX/STR Functions for converting string to hex and vice versa function strhex($string) { $hex=''; for ($i=0; $i < strlen($string); $i++) { $hex .= dechex(ord($string[$i])); } return $hex; } function hexstr($hex) { $string=''; for ($i=0; $i < strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); } return $string; } // Search Criterium $jpgs = "ffd8ff"; echo "yoya Start<br />" . $jpgs; echo "<br />jpgoff " . $jpgeoff; $jpge = "ffd9"; echo "<br />jpge " . $jpge; // Input file to string $ipfileg = file_get_contents('ti.ad1'); // Turn to hex $ipfile = strhex($ipfileg); // Input file length for math $m1 = strlen($ipfile); echo "<br />m1 " . $m1; // Check for empty file if(isset($ipfile)) { } else { echo "ERROR - Empty File!<br />"; } // Set starting offset with first criterium find $soff = strpos($ipfile, $jpgs); echo "<br />soff " . $soff; // Do math to find where to start substr to cut first part off beginning of string. $x1 = $soff; echo "<br />x1 " . $x1; $x2 = ($m1 - $soff); echo "<br />x2 " . $x2; // Execute the final math into cuts. $ipfile = substr($ipfile, $x1, $x2); // New input file length for more math. $m2 = strlen($ipfile); echo "<br />m2 " . $m2; // Set ending offset. My jpeg test files had three hits for FFD9, so I need to skip two. $eoff1 = strpos($ipfile, $jpge); $eoff2 = ($eoff1 + 1); $eoff3 = strpos($ipfile, $jpge, $eoff2); $eoff4 = ($eoff3 + 1); $eoff = strpos($ipfile, $jpge, $eoff4); echo "<br />eoff " . $eoff; // Do math to find where to start substr to cut second part off end of string. Start at 0 for beginning of jpg, keep chars via math, cuts rest off. $y1 = "0"; echo "<br />y1 " . $y1; $y2 = ($eoff + 4); echo "<br />y2 " . $y2; // Execute the final math into cuts. $ipfile = substr($ipfile, $y1, $y2); // Convert hex to ASCII string. $ipfile = hexstr($ipfile); // The $ipfile string should now contain the ASCII string of only the JPG file. echo "<br />final " . $ipfile; // Create JPG file. file_put_contents("test.jpg", $ipfile); ?>
Проблема, конечно, не в функции strpos()
, вот тест:
$needle = "ÿÙ"; $haystack1 = "afafjkaskÿ\0Ùasdf"; $haystack2 = "afafjkaskÿÙasdf"; var_dump( strpos( $haystack1, $needle ) ); var_dump( strpos( $haystack2, $needle ) );
результат:
bool(false) int(9)
strpos()
работает точно так, как ожидалось здесь.