gpt4 book ai didi

php - 如何判断字符串是否被压缩?

转载 作者:可可西里 更新时间:2023-11-01 12:23:56 25 4
gpt4 key购买 nike

如何确定字符串是否使用 gzcompress 进行了压缩(除了在调用 gzuncompress 之前/之后比较字符串的大小之外,还是这样做的正确方法)?

最佳答案

PRE:
我想,如果你发送了一个请求,你可以立即查看$http_response_header 看看是不是数组中的项目是 Content-Encoding: gzip 的变体。但这是 LAME!
有一个更好的方法。


这是如何...

检查它是否是 GZIP。像个BOSS!

according to GZIP RFC:

gzip 内容的标题如下所示

+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+

ID1ID2 将内容标识为 GZIPCM 声明 ZLIB_ENCODING(压缩方法)是 ZLIB_ENCODING_DEFLATE - GZIP 通常使用所有网络服务器。

oh! 它们具有固定值:

  • ID1 的值为"\x1f"
  • ID2 的值为"\x8b"
  • CM 的值为"\x08" (或者只是 8...)<

快到了:

$is_gzip = 0 === mb_strpos($mystery_string, "\x1f". "\x8b". "\x08");

工作示例

<?php
/** @link https://gist.github.com/eladkarako/d8f3addf4e3be92bae96#file-checking_gzip_like_a_boss-php */

date_default_timezone_set("Asia/Jerusalem");

while (ob_get_level() > 0) ob_end_flush();
mb_language("uni");
@mb_internal_encoding('UTF-8');
setlocale(LC_ALL, 'en_US.UTF-8');

header('Time-Zone: Asia/Jerusalem');
header('Charset: UTF-8');
header('Content-Encoding: UTF-8');
header('Content-Type: text/plain; charset=UTF-8');
header('Access-Control-Allow-Origin: *');

function get($url, $cookie = '') {
$html = @file_get_contents($url, false, stream_context_create([
'http' => [
'method' => "GET",
'header' => implode("\r\n", [''
, 'Pragma: no-cache'
, 'Cache-Control: no-cache'
, 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2310.0 Safari/537.36'
, 'DNT: 1'
, 'Accept-Language: en-US,en;q=0.8'
, 'Accept: text/plain'
, 'X-Forwarded-For: ' . implode(', ', array_unique(array_filter(array_map(function ($item) { return filter_input(INPUT_SERVER, $item, FILTER_SANITIZE_SPECIAL_CHARS); }, ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'HTTP_CLIENT_IP', 'SERVER_ADDR', 'REMOTE_ADDR']), function ($item) { return null !== $item; })))
, 'Referer: http://eladkarako.com'
, 'Connection: close'
, 'Cookie: ' . $cookie
, 'Accept-Encoding: gzip'
])
]]));

$is_gzip = 0 === mb_strpos($html, "\x1f" . "\x8b" . "\x08", 0, "US-ASCII");

return $is_gzip ? zlib_decode($html, ZLIB_ENCODING_DEFLATE) : $html;
}

$html = get('http://www.pogdesign.co.uk/cat/');

echo $html;

我们在这里看到什么值得一提?

  • 首先初始化 PHP 引擎以使用 UTF-8(因为我们真的不知道网络服务器是否返回 GZIP 内容。
  • 提供 header Accept-Encoding: gzip,告诉网络服务器,它可能输出一个GZIP内容。
  • 发现 GZIP 内容(您应该使用具有ASCII 编码 的多字节函数)。
  • 最终返回纯输出,使用 ZLIB 方法很容易。

关于php - 如何判断字符串是否被压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10975775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com