在PHP中解压二进制数据
我使用的第三方API允许我通过POST请求上传图像,参数必须为二进制格式,例如在PHP中解压二进制数据,php,binary,pack,unpack,Php,Binary,Pack,Unpack,我使用的第三方API允许我通过POST请求上传图像,参数必须为二进制格式,例如[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,3,…] 我尝试使用unpack()函数并获得了要上载的二进制数据,但当我尝试在上载服务器上查看它时,我只得到了一张空白图像,但图像大小是正确的。所以我认为数据就在那里,我只是在解包时做错了什么 if(!$fp = fopen ($image_url, 'rb')) return 0;
[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,3,…]
我尝试使用unpack()
函数并获得了要上载的二进制数据,但当我尝试在上载服务器上查看它时,我只得到了一张空白图像,但图像大小是正确的。所以我认为数据就在那里,我只是在解包时做错了什么
if(!$fp = fopen ($image_url, 'rb')) return 0;
/* Read bytes from the top of the file */
if(!$data = fread ($fp, filesize($image_path))) return 0;
/* Unpack data */
$data = unpack ('C*', $data);
//$data value: Array ( [1] => 137 [2] => 80 [3] => 78 [4] => 71 [5] => 13....
为了测试它是否能正确地转换回图像,我使用了pack()
函数,如下所示:
$bin = pack('C*', ...$data);
header('Content-type: image/png');
header('Content-Disposition: inline; filename="test_image"');
header('Content-Transfer-Encoding: binary');
echo $bin;
exit();
因此,这将输出一个png文件,该文件为空白,但与原始图像的大小相同。有没有办法修复解包功能,使其正确转换回?我无法控制如何显示它,因为它在第三方API中,所以我只能在第一个代码块上更正它。我对您正在做的事情做了一些修改,这对我来说很有用:
$data = file_get_contents('test.png');
$u = unpack('C*', $data);
$bin = pack('C*', ...$u);
header('Content-type: image/png');
echo $bin;
exit();
我的假设是,您的
fopen
和fread
没有返回您所期望的结果。我已经对您所做的做了一些修改,这对我很有用:
$data = file_get_contents('test.png');
$u = unpack('C*', $data);
$bin = pack('C*', ...$u);
header('Content-type: image/png');
echo $bin;
exit();
我的假设是,您的
fopen
和fread
没有返回您期望的结果。Q:您检查了$data中的字节了吗?第一个字节仍然是“137”(0x89,.png文件中的第一个字节)?也许您的源主机和目标主机之间存在差异?是的,仍然如此!我不认为我和主人之间有什么区别,因为如果我在我的两端(连续地)运行这两个块,它仍然显示空白图像。听起来数据可能还可以。在这种情况下,真正的问题可能根本不是打包/解包。使用Fiddler(或等效工具)查看HTTP流量,并比较“成功显示”与“空白图像”。也许问题实际上在其中一个HTTP头中?或者有效负载没有正确发送?Q:您检查了$data中的字节了吗?第一个字节仍然是“137”(0x89,.png文件中的第一个字节)?也许您的源主机和目标主机之间存在差异?是的,仍然如此!我不认为我和主人之间有什么区别,因为如果我在我的两端(连续地)运行这两个块,它仍然显示空白图像。听起来数据可能还可以。在这种情况下,真正的问题可能根本不是打包/解包。使用Fiddler(或等效工具)查看HTTP流量,并比较“成功显示”与“空白图像”。也许问题实际上在其中一个HTTP头中?或者可能有效负载没有正确发送?