8

在 PHP 中发出 gzip 放气请求后,我收到了偏移块中的放气字符串,如下所示

示例大大缩短以显示格式:

00001B4E
¾”kŒj…Øæ’ìÑ«F1ìÊ`+ƒQì¹UÜjùJƒZ\µy¡ÓUžGr‡J&=KLËÙÍ~=ÍkR
0000102F
ñÞœÞôΑüo[¾”+’Ñ8#à»0±R-4VÕ’n›êˆÍ.MCŽ…ÏÖr¿3M—èßñ°r¡\+
00000000

大概是因为分块格式,我无法夸大它。在使用十六进制编辑器手动删除偏移量并阅读 gzip 存档后,我可以确认数据没有损坏。我想知道是否有一种适当的方法可以将这个分块的 gzip 放气响应解析为可读的字符串?

我也许可以拆分这些偏移量并将数据连接到一个字符串中以调用 gzinflate,但似乎必须有一种更简单的方法。

4

2 回答 2

11

对分块响应进行放气的正确方法大致如下:

initialise string to hold result
for each chunk {
  check that the stated chunk length equals the string length of the chunk
  append the chunk data to the result variable
}

这是一个方便的 PHP 函数来为您执行此操作(已修复):

function unchunk_string ($str) {

  // A string to hold the result
  $result = '';

  // Split input by CRLF
  $parts = explode("\r\n", $str);

  // These vars track the current chunk
  $chunkLen = 0;
  $thisChunk = '';

  // Loop the data
  while (($part = array_shift($parts)) !== NULL) {
    if ($chunkLen) {
      // Add the data to the string
      // Don't forget, the data might contain a literal CRLF
      $thisChunk .= $part."\r\n";
      if (strlen($thisChunk) == $chunkLen) {
        // Chunk is complete
        $result .= $thisChunk;
        $chunkLen = 0;
        $thisChunk = '';
      } else if (strlen($thisChunk) == $chunkLen + 2) {
        // Chunk is complete, remove trailing CRLF
        $result .= substr($thisChunk, 0, -2);
        $chunkLen = 0;
        $thisChunk = '';
      } else if (strlen($thisChunk) > $chunkLen) {
        // Data is malformed
        return FALSE;
      }
    } else {
      // If we are not in a chunk, get length of the new one
      if ($part === '') continue;
      if (!$chunkLen = hexdec($part)) break;
    }
  }

  // Return the decoded data of FALSE if it is incomplete
  return ($chunkLen) ? FALSE : $result;

}
于 2012-04-03T13:11:44.517 回答
1

使用gzinflate解码 String , Zend_Http_Client lib 将有助于完成此类常见任务,使用起来很麻烦,如果您需要自己做,请参考Zend_Http_Response 代码

于 2012-04-03T12:55:00.177 回答