Как преобразовать данные изображения в формате NSDATA (шестнадцатеричный), поступающие через XML-RPC, в фактическое изображение в PHP - PullRequest
2 голосов
/ 05 августа 2011

Я столкнулся с очень запутанной проблемой, когда мое приложение Iphone отправляет данные изображения в виде строки в формате NSDATA с использованием XML-RPC на веб-сервер. Я также веду журнал XML-RPC для сохранения каждого запроса, поступающего с iPhone на веб-сервер. Моя проблема заключается в том, что когда я получил данные изображения из xml-rpc и сохранил их в фактический файл изображения, изображение повреждено. Я получаю следующий запрос XML-RPC от iphone.

<?xml version="1.0"?><methodCall><methodName>ipad.dataSync</methodName>
<params><param>
<value><string>&lt;ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966
00004d4d 002a0000 00080002 01120003 00000001 00010000 &gt;.....continued data of image>
</string></value>
</param><params>
</methodCall>

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

$image_name = "my_image_name.png";
$image_bits_data = "&lt;ffd8ffe0 00104a46 49460001.....&gt;"; //long hexadecimal formatted string of image from iphone
$fp = @fopen( $image_name, 'w+' );

if($fp)
{

  if (fwrite($fp, $image_bits_data) === FALSE)
  {
       echo "Cannot write to file ($image_name)";
       exit;
  }
  else
 {
     fclose( $fp );
     clearstatcache();
     echo "File is successfully uploaded.";
 }

}
else
{
   echo "File can not be created.Please check the path and directory
permission";

}

Изображение имеет соответствующий размер, например, 50 КБ и т. Д., Но когда я открываю изображение, оно повреждается и изображение не отображается в Picture Viewer или браузере. Пожалуйста, если у кого-нибудь есть подсказка или решение по этому вопросу, поделитесь им. БЛАГОДАРЯ

1 Ответ

0 голосов
/ 05 августа 2011

Похоже, вы сохраняете строку шестнадцатеричных чисел, разделенных пробелами, в файл PNG - это, очевидно, не может быть правильным.По крайней мере, попытайтесь преобразовать его в двоичный файл, что-то вроде

// get rid of the "&lt;" and "&gt;" in the begginig/end of the str so it looks like
$image_bits_data = "ffd8ffe0 00104a46 49460001....."; //long hexadecimal formatted string of image from iphone

$fp = fopen( $image_name, 'w+b');

foreach(explode(" ", $image_bits_data) as $hex){
   fwrite($fp, pack('H', $hex));
}

Возможно, вам также придется поиграть с порядком байтов (т.е. используйте «h» в pack()).Но это не выглядит многообещающе - в начале данных есть два ff байта, и AFAIK никакой файл PNG не начинается с такого заголовка.Возможно, есть какой-то дополнительный заголовок, который вы должны удалить ...

...