0%

PHP 字符串压缩与node zlib、pako

探索 PHP 字符串压缩,与 node 中 zlib、pako 库压缩、解压缩处理。

  • DEFLATE,是一种使用 Lempel-Ziv 压缩算法(LZ77)和哈夫曼编码的压缩格式。详见 RFC 1951
  • ZLIB,是一种使用 DEFLATE 的压缩格式,对应 HTTP 中的 Content-Encoding: deflate。详见 RFC 1950
  • GZIP,也是一种使用 DEFLATE 的压缩格式,对应 HTTP 中的 Content-Encoding: gzip。详见 RFC 1952

Content-Encoding 中的 deflate,实际上是 ZLIB。ZLIB 和 GZIP 都是 RAW DEFLATE 的不同 Wrapper。

PHP 字符串压缩函数

  • gzcompress ,对应解压缩函数:gzuncompress,使用 raw ZLIB 数据格式。
  • gzdeflate,对应解压缩函数:gzinflate,使用 raw DEFLATE 数据格式。
  • gzencode,对应解压缩函数:gzdecode,压缩成 gzip 编码数据。
  • bzcompress,对应解压缩函数:bzdecompress,压缩成 bzip2 编码数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo base64_encode(gzdeflate('1234'));
// output: MzQyNgEA
echo gzinflate(base64_decode("MzQyNgEA"));
// output: 1234
echo base64_encode(gzdeflate('1234', 6, ZLIB_ENCODING_DEFLATE));
// output: eJwzNDI2AQAB+ADL
echo gzinflate(base64_decode("eJwzNDI2AQAB+ADL"));
// error: PHP Warning: gzinflate(): data error in php shell code on line 1

echo base64_encode(gzcompress('1234'));
// output: eJwzNDI2AQAB+ADL
echo gzuncompress(base64_decode("eJwzNDI2AQAB+ADL"));
// output: 1234

echo base64_encode(gzencode('1234'));
// output: H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA
echo gzdecode(base64_decode("H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA"));
// output: 1234

echo base64_encode(bzcompress('1234'));
// 因当前环境未激活 bzip2 支持,所以暂未测试。需在编译 PHP 时增加 `--with-bz2[=DIR]` 配置项。

pako

1
npm install pako@1.0.6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const pako = require('pako');

function btoa(str) {
return Buffer.from(str).toString('base64');
}

function atob(b64Encoded) {
return Buffer.from(b64Encoded, 'base64');
}

var zipResult = btoa(pako.deflate("1234"));
console.log(zipResult);
// output: eJwzNDI2AQAB+ADL
var unzipResult = pako.inflate(atob("eJwzNDI2AQAB+ADL"), { to: 'string' });
console.log(unzipResult);
// output: 1234

var zipResult = btoa(pako.gzip("1234"));
console.log(zipResult);
// output: H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA
var unzipResult = pako.ungzip(atob("H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA"), {to: "string"});
console.log(unzipResult);
// output: 1234

zlib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const zlib = require('zlib');

function btoa(str) {
return Buffer.from(str).toString('base64');
}

function atob(b64Encoded) {
return Buffer.from(b64Encoded, 'base64');
}

var zipResult = btoa(zlib.deflateSync("1234"));
console.log(zipResult);
// output: eJwzNDI2AQAB+ADL
var unzipResult = zlib.inflateSync(atob("eJwzNDI2AQAB+ADL")).toString();
console.log(unzipResult);
// output: 1234

var zipResult = btoa(zlib.gzipSync(Buffer.from("1234")));
console.log(zipResult);
// output: H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA
var unzipResult = zlib.gunzipSync(atob("H4sIAAAAAAAAAzM0MjYBAKPg45sEAAAA")).toString();
console.log(unzipResult);
// output: 1234

参考