【问题标题】:Unpacking binary data in PHP在 PHP 中解压缩二进制数据
【发布时间】:2020-11-11 01:50:00
【问题描述】:

我正在使用第三方 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 中的字节吗?第一个字节仍然是“137”(0x89,.png 文件中的第一个字节)吗?也许您的源主机和目标主机之间存在不同的byte ordering
  • 是的,它仍然是!我认为我和主机之间没有任何区别,因为如果我在我的一端(连续)运行这两个块,它仍然会显示空白图像。
  • 好的。听起来数据实际上可能还可以。在这种情况下,REAL 问题可能根本不是打包/解包。使用 Fiddler(或同等工具)查看 HTTP 流量,并比较“成功显示”与“空白图像”。也许问题实际上出在 HTTP 标头之一中?或者可能没有正确发送有效载荷?

标签: php binary pack unpack


【解决方案1】:

我对你正在做的事情做了一些修改,这对我有用:

$data = file_get_contents('test.png');
$u    = unpack('C*', $data);
$bin  = pack('C*', ...$u);

header('Content-type: image/png');
echo $bin;
exit();

我的假设是您的 fopenfread 没有返回您所期望的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多