在PHP中解压二进制数据

在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;

我使用的第三方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;
        /* 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头中?或者可能有效负载没有正确发送?