如何充气部分字符串

时间:2014-08-01 14:35:17

标签: javascript node.js buffer zlib inflate

在NodeJS中构建NNTP客户端时,遇到了以下问题。调用XZVER命令时,我从套接字连接收到的第一个数据包含字符串和膨胀字符串;

224 compressed data follows (zlib version 1.2.3.3)
^*�u�@����`*�Ti���d���x�;i�R��ɵC���eT�����U'�|/S�0���� rd�
                                                   z�t]2���t�bb�3ѥ��>�͊0�ܵ��b&b����<1/    �C�<[<��d���:��VW̡��gBBim�$p#I>5�cZ�*ψ%��u}i�k�j
                                                                                                                                    �u�t���8�K��`>��im

当我分割这个字符串并试图像这样膨胀它时;

lines = chunk.toString().split('\r\n');
response = lines.shift();

zlib.inflate(new Buffer(lines.shift()), function (error, data) {
    console.log(arguments);
    callback();
});

我收到以下错误;

[Error: invalid code lengths set] errno: -3, code: 'Z_DATA_ERROR'

欢迎任何帮助,我有点困在这里:(

更新

在实现了mscdex的答案之后,整个函数看起来像这样;

var util = require('util'),
    zlib = require('zlib'),
    Transform = require('stream').Transform;

function CompressedStream () {
  var self = this;

  this._transform = function (chunk, encoding, callback) {
    var response = chunk.toString(),
        crlfidx = response.indexOf('\r\n');

    response = response.substring(0, crlfidx);
    console.log(response);

    zlib.gunzip(chunk.slice(crlfidx + 2), function (error, data) {
      console.log(arguments);
      callback();
    });
  };

  Transform.call(this/*, { objectMode: true } */);
};

util.inherits(CompressedStream, Transform);

module.exports = CompressedStream;

2 个答案:

答案 0 :(得分:0)

如果这两个字节在原始数据中,您应该避免使用split()。您可以尝试这样的事情:

var response = chunk.toString(),
    crlfidx = response.indexOf('\r\n');
// should probably check crlfidx > -1 here ...
response = response.substring(0, crlfidx);

zlib.inflate(chunk.slice(crlfidx + 2), function (error, data) {
    console.log(arguments);
    callback();
});

但是,如果您在'data'事件处理程序中执行此操作,则应注意您可能无法在单个块中获取所需的数据。具体来说,您可以在块之间获得CRLF分割,或者您可以在一个块中获得多个响应。

答案 1 :(得分:0)

似乎我的块被错误编码了。删除socket.setEncoding('utf8');后,问题就解决了。