1

我正在尝试测试文本是否通过 Snappy 压缩。我正在使用 Node.JS https://github.com/kesla/node-snappy库。

归功于此答案以获取有关从文件读取的帮助。

$cat Decompress.js 
var snappy = require('snappy');
var fs     = require('fs');

var filename = './snappy_compressed_docs/snappy_compressed_file'

fs.readFile(filename, 'utf8', function(err, data) {
    if (err) throw err;    
    console.log("done printing data. 'typeof data':", typeof data);

    console.log("snappy: ", snappy);

        snappy.isValidCompressed(data, function(e, result) {
        if(e) { console.log("error!", e); throw e; }
            console.log("snappy.isValidCompressed:", result);
    });
});

这是我得到的:

$node Decompress.js 
done printing data. 'typeof data': string
snappy:  { compress: [Function],
  isValidCompressed: [Function: isValidCompressed],
  uncompress: [Function] }
Assertion failed: (obj->HasIndexedPropertiesInExternalArrayData()),
 function Length, file ../src/node_buffer.cc, line 115.
Abort trap: 6

Assertion failed...部分发生了什么?

4

1 回答 1

3

这里的问题是isValidCompressed需要一个缓冲区,而不是一个字符串。

基于失败的断言,我们可以看到我们正在“外部”数组数据中寻找奇怪的属性,这意味着某处的某些东西期望比 JavaScript 字符串更原始的东西。如果我们查看 node-snappy 的isValidCompressedbindings,我们会看到它将其输入数据视为node::Buffer. 由于typeof data是给我们的string,我们可能没有正确类型的数据。

这里的解决方案是将'utf8'参数删除到readFile,这将数据作为原始缓冲区提供给我们,而不是尝试将其转换为字符串。

于 2015-02-18T21:42:55.250 回答