【问题标题】:Decoding a gzipped string in PHP在 PHP 中解码 gzip 后的字符串
【发布时间】:2019-01-11 04:28:54
【问题描述】:

我正在尝试使用 PHP 解码 REST 响应 (YouTrack-API) 的 gzip 压缩正文。似乎没有任何效果:

  • 从 CURL 自动解码没有任何作用
  • 在标头设置为接受编码的情况下使用 Guzzle 没有任何作用
  • 只需将获取的字符串放入 gzdecode() 什么都不做

我尝试过 gzinflate、gzdecode 和它们的一些狂野组合,包括在开始和结束时剥离字节,但没有成功。我绝不是压缩方面的专家,所以我不知道 gzip 压缩的字符串是否可以采用不同的格式,但是任何旧的“在线 gzip 服务”都可以毫无问题地解码字符串

简单示例: 这个字符串:

H4sIAAAAAAAA//NIzcnJV8jPSVEozy/KSQEARAYhbw8AAAA=

应该输出:

Hello old world

放入我能找到的任何在线转换器,它可以工作,放入任何 PHP 函数:数据错误。 PHP 和 gzip 根本不起作用是怎么回事?是否与整个响应被压缩或只是内容有关?

【问题讨论】:

    标签: php rest gzip guzzle php-curl


    【解决方案1】:

    压缩后的字符串是base64编码的,所以你需要这样做:

    echo gzdecode(base64_decode('H4sIAAAAAAAA//NIzcnJV8jPSVEozy/KSQEARAYhbw8AAAA='));
    

    【讨论】:

    • 谢谢... 但是怎么会知道呢?该 API 只是声明“它是 gzipped”,并且从未提及它是 base64 编码的。你能从字符串的样子“看到”它吗?
    • @RemizZ = 用作 base 64 编码字符串末尾的填充。如果您看到一个由字母数字字符 +/ 组成的字符串,并在末尾带有等号,则可以肯定它是 base64 编码的。
    • @RemizZ iainn 说了什么。另外,我之前使用过 gzipped API ;)
    • 是的,你可以看到它。压缩良好的数据将无法与随机数据区分开来,因此所有字节值的分布都是从 0 到 255 的平坦分布。如果字符串只有可打印字符,即可能的 256 个字符中少于 96 个,那么您知道要么它没有被压缩,或者它是压缩二进制数据的编码。最常见的此类编码是 Base-64,它恰好使用一个或两个(或零)终止等号。所以这将是第一个尝试获取该数据的人。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 2011-02-03
    • 2013-01-15
    相关资源
    最近更新 更多