【问题标题】:PHP's gzuncompress function in node.jsnode.js 中 PHP 的 gzuncompress 函数
【发布时间】:2011-08-12 02:36:24
【问题描述】:

所以我得到了一些使用 PHP 的 gzcompress 方法压缩的数据: http://us2.php.net/manual/en/function.gzcompress.php

如何从 node.js 解码这些数据??

我尝试了“compress”、“zlib”和其他几个节点压缩库,但似乎没有一个能够识别数据。例如,zlib 只是给我“错误:不正确的标头检查”

答案:事实证明“zlib”是要走的路。我们遇到了来自 memcache 的二进制数据的另一个问题。如果你在 node.js Buffer 对象中有二进制数据,并且你调用 toString() 而不是 .toString('binary'),它会因为内容被转义或转义序列被解释或其他原因而受到各种扰乱。不幸的是,迄今为止我尝试过的所有 memcache 插件都假定来自 memcache 的字符串数据,并且没有规范地正确处理它。

我发现的最佳 ZLIB 模块:

https://github.com/kkaefer/node-zlib

// first run "npm install zlib", then...
var zlib = require('zlib');
var gz = zlib.deflate(new Buffer("Hello World", 'binary')); // also another 'Buffer'
console.log(zlib.inflate(gz).toString('binary'));

仅供参考,这个问题与有关 Java 的相关问题非常相似: PHP's gzuncompress function in Java?

【问题讨论】:

    标签: php node.js gzip zlib


    【解决方案1】:

    从另一个帖子中窃取 (Which compression method to use in PHP?)

    • gzencode() 使用完全自包含的 gzip 格式,与 gzip 命令行工具相同
    • gzcompress() 使用原始 ZLIB 格式。它类似于 gzencode,但具有不同的标头数据等。我认为它是用于流式传输的。
    • gzdeflate() 自己使用原始 DEFLATE 算法,这是其他两种格式的基础。

    因此,“zlib”将是正确的选择。这与 gzip 不交叉兼容。

    试试https://github.com/kkaefer/node-zlib

    【讨论】:

    • 请注意,node.js zlib 包含 inflateRaw(),因此您可以处理带和不带 header 的 PHP 表单。
    【解决方案2】:

    php:

    <?php 
    $data = 'HelloWorld';
    $gzcompress = gzcompress($data);
    $gzcompress_base64_encode = base64_encode($gzcompress);
    echo "Compressing: {$data}\n";
    echo $gzcompress."\n";
    echo $gzcompress_base64_encode."\n";
    echo "--- inverse ---\n";
    echo gzuncompress(base64_decode($gzcompress_base64_encode))."\n";
    

    nodejs:

    const zlib = require('zlib');
    var data = 'HelloWorld';
    var z1 = zlib.deflateSync( Buffer.from(data));
    
    var gzcompress = z1.toString();
    var gzcompress_base64_encode = z1.toString('base64');
    console.log('Compressing '+data);
    console.log(gzcompress);
    console.log(gzcompress_base64_encode);
    console.log('--- inverse ---');
    console.log(zlib.inflateSync(Buffer.from(gzcompress_base64_encode,'base64')).toString());
    

    【讨论】:

    • 您好 ColudFrameWork,请帮帮我。如果我有 gzcompress,我怎样才能得到 z1。输入:gzcompress,输出:我想要 z1 的值。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多