如何将通过XML-RPC的NSDATA格式(十六进制)的图像数据转换为PHP中的实际图像

时间:2011-08-05 07:56:19

标签: php iphone image xml-rpc nsdata

我面临一个非常令人困惑的问题,我的Iphone应用程序使用XML-RPC将图像数据作为NSDATA格式的字符串发送到网络服务器。我还维护XML-RPC日志以保存从iPhone到Web服务器的每个请求。我的问题是当我从xml-rpc收到图像数据并将其保存到实际图像文件时,图像被损坏。我正在接收来自iphone的以下XML-RPC请求。

<?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";

}

图像给出了适当的大小,如50KB等,但是当我打开图像时,它会被损坏,图像不会显示在图片查看器或浏览器中。如果有人得到线索或解决这个问题,请分享。感谢

1 个答案:

答案 0 :(得分:0)

看起来你将一串空格分隔的十六进制数字保存到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));
}

你可能也必须摆弄字节顺序(即在pack()中使用“h”)。但它看起来并不太有希望 - 数据开头有两个ff字节,而AFAIK没有PNG文件以这样的标头开头。可能有一些额外的标题你必须删除...