【问题标题】:Zlib: Node.js can't extract compressed data from pythonZlib:Node.js 无法从 python 中提取压缩数据
【发布时间】:2018-05-19 01:32:10
【问题描述】:

我使用python压缩字符串数据并将数据存储在sqlite3中。对于我的项目,我还需要使用 node.js 来提取数据。问题是,当我尝试这样做时。我从 node.js 收到错误:

{ 错误:标头检查不正确 在 Gunzip.zlibOnError (zlib.js:153:15) 错误号:-3,代码:'Z_DATA_ERROR' }

我尝试在 Python 中使用 Base64 和 utf8 对字符串进行编码。两者都没有区别。

在 JavaScript 中,我尝试跳过编码数据的一些位,以便我可以克服头部检查问题。这也是徒劳的。

这是python中的压缩代码

import zlib, base64
import time
text = 'STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW STACK OVERFLOW '
textToBytes = text.encode('utf-8')
code =  zlib.compress(textToBytes)

code = base64.b64encode(code)
print('code in base64:', code)

timestamp = time.time()
#Store in database
conn = sqlite3.connect('testsDummy.db')
c = conn.cursor()

c.execute("CREATE TABLE IF NOT EXISTS tests (id INTEGER PRIMARY KEY, timestamp REAL, code TEXT)")
conn.commit()
c.execute("INSERT INTO  tests (code ,timestamp) VALUES (?,?)",(code ,timestamp))
conn.commit()
conn.close()

现在这是 node.js 中的代码

function toArrayBuffer(buffer) {
  var arrayBuffer = new ArrayBuffer(buffer.length);
  var view = new Uint8Array(arrayBuffer);
  for (var i = 0; i < buffer.length; ++i) {
    view[i] = buffer[i];
  }
  return arrayBuffer;
}

app.get('/download/logfile/:timestamp', (req, res) => {
  var zlib = require('zlib');

  var db = new sqlite3.Database(path.join(__dirname, 'dependencies', 'testsDummy.db'));
  db.serialize(() => {
    db.all('SELECT code FROM tests WHERE timestamp=' + req.params.timestamp, (error, tests) => {
      db.close();

      if (tests[0].code== '' || tests[0].code== null) {
        res.send('No qdxm data collected.');
      }
      else {
        console.log(tests[0].code)
        var arrayBuffer = toArrayBuffer(Buffer.from(tests[0].code, 'base64'));
        zlib.gunzip(Buffer.from(arrayBuffer, 4), function (err, uncompressedMessage) {
          if (err) {
            console.log(err)
            res.send();
          }
          else {
            res.json({ uncompressedMessage: uncompressedMessage.toString() })
            console.log(uncompressedMessage.toString())
          }
        });
      }
    });
  });
});

【问题讨论】:

  • 你把BytesTotext写入数据库,就是解压后的数据。您的第一个插入也有 timestamp, BytesTotext 反转(另外,为什么有两个插入?)。
  • 哦,很抱歉让您感到困惑。我试图改变一些不相关的输入,以便人们更好地理解。但显然我犯了一些错误。现在已经更正了上面的代码。感谢您指出这一点。@kichik

标签: javascript python node.js sqlite zlib


【解决方案1】:

Python 中的zlib.compress(没有wbits 参数)将生成zlib 格式,而Node.js 中的zlib.gunzip 需要gzip 格式。要么使用zlib.compresswbits等于31得到gzip格式,要么在Node.js中使用zlib.inflate解压zlib格式。

【讨论】:

  • 感谢您回答这个问题。我试过你的方法。好吧zlib.compress 没有参数wbits。但是zlib.compressobj 有。所以我尝试了类似:zlib.compressobj(wbits = 31).compress()。但不幸的是,我得到了和以前一样的标题检查。 zlib.inflate 也是如此。
  • 事实证明,当我选择code = base64.b64encode(code) 时。然后zlib.inflate 将完成这项工作。谢谢@Mark Adler
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多