Zlib nodejs错误:存储的块长度无效

时间:2019-02-19 13:15:16

标签: c node.js zlib

我正在尝试通过网络发送一些压缩的数据,我认为数据已成功压缩,因为我可以从分解数据的代码(用C语言编写)中重新填充它,但是当数据到达我的计算机时,服务器(使用express的nodejs),并尝试使我收到的数据膨胀:

{ Error: invalid stored block lengths
    at InflateRaw.zlibOnError (zlib.js:153:15) errno: -3, code: 'Z_DATA_ERROR' }

在此先感谢您的帮助。

Szz。

P.D:如果任何人都有用,我可以提供一些简短的代码。

编辑:

感谢您的快速回答,对于延迟,我们一直在努力,现在我正在将原始数据与压缩数据一起发送到服务器。当原始数据到达服务器时,我将其缩小以查看生成的缓冲区,令人惊讶的是,通过网络发送的压缩数据的缓冲区与服务器中压缩的缓冲区相同,除了前两个字节是相同的 特别是:

<Buffer 78 da 15 8c c9 11 00 41 08 02 ff c6 82 55 83 b7 f9 27 b6 ee 13 68 7a a6 b0 4c b8 a7 68 ac 81 61 84 5a 8b e6 82 6b 05 bd aa 44 d9 5e a0 d7 20 6c 2f a6 ... >

<Buffer 15 8c c9 11 00 41 08 02 ff c6 82 55 83 b7 f9 27 b6 ee 13 68 7a a6 b0 4c b8 a7 68 ac 81 61 84 5a 8b e6 82 6b 05 bd aa 44 d9 5e a0 d7 20 6c 2f a6 bf 9b ... >

那么,我想我现在的问题是,我是否可以假设前两个字节将始终出现在C程序的压缩数据中?有什么选择可以避免前两个字节?我过得好吗?

在这里,我留给您用于压缩C部分中数据的函数,节点部分仅是强大的解析post输入,现在需要一些缓冲区。

int compress_image (compressed_image raw, size_t size, compressed_image * out) {

    z_stream strm;
    int out_size = 0;

    *out = (compressed_image) malloc(size);

    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;

    int ret = deflateInit(&strm, Z_BEST_COMPRESSION); /* Max compression level, but bad speed performace */

    if (ret != Z_OK)
        return ret;

    strm.avail_in = size;
    strm.next_in = (unsigned char *)raw;

    do {

        strm.avail_out = size;
        strm.next_out = *out;
        ret = deflate(&strm, Z_FINISH);    /* no bad return value */
        assert(ret != Z_STREAM_ERROR);  /* state not clobbered */
        out_size += (size - strm.avail_out);

    } while (strm.avail_out == 0);

    (void)deflateEnd(&strm);

    return out_size;
}

再次感谢!

编辑2: 我现在正在转储缓冲区,我可以看到一些尾随字节也有所不同, 在这里,您有来自C程序的缓冲区:

00000000: 78da 158c c911 0041 0802 ffc6 8255 83b7  xÚ..É..A..ÿÆ.U.·
00000010: f927 b6ee 1368 7aa6 b04c b8a7 68ac 8161  ù'¶î.hz¦°L¸§h¬.a
00000020: 845a 8be6 826b 05bd aa44 d95e a0d7 206c  .Z.æ.k.½ªDÙ^.× l
00000030: 2fa6 bf9b 680e f2ce 9c67 975f 0e58 2d91  /¦¿.h.òÎ.g._.X-.
00000040: 75dc f1ed b25c 687a 43dd 42bc 1f98 e7dd  uÜñí²\hzCÝB¼..çÝ
00000050: 79a7 99f6 5fd3 bfcc 86f2 01b0 f51a cd    y§.ö_Ó¿Ì.ò.°õ.Í

然后在服务器中放空缓冲区:

00000000: 158c c911 0041 0802 ffc6 8255 83b7 f927  ..É..A..ÿÆ.U.·ù'
00000010: b6ee 1368 7aa6 b04c b8a7 68ac 8161 845a  ¶î.hz¦°L¸§h¬.a.Z
00000020: 8be6 826b 05bd aa44 d95e a0d7 206c 2fa6  .æ.k.½ªDÙ^.× l/¦
00000030: bf9b 680e f2ce 9c67 975f 0e58 2d91 75dc  ¿.h.òÎ.g._.X-.uÜ
00000040: f1ed b25c 687a 43dd 42bc 1f98 e7dd 79a7  ñí²\hzCÝB¼..çÝy§
00000050: 99f6 5fd3 bfcc 86f2 01   

但是创建一个没有前两个字节的新缓冲区,我可以将我的数据正确填充到服务器中:

我的node.js部分:

const dump = require('buffer-hexdump');

router.post('/test', function(req, res, next) {

    let form = new formidable.IncomingForm();
    form.uploadDir = "./uploads"

    form.parse(req, function(err, fields, files) {

        let deflated = zlib.deflateRawSync(fs.readFileSync(files.image_raw.path));

        let image_buff = fs.readFileSync(files.image.path);
        let buff = Buffer.alloc(image_buff.length - 2);

        image_buff.copy(buff, 0, 2);

        console.log(buff.equals(deflated)); //false
        console.log(dump(deflated));
        console.log(dump(image_buff));

        zlib.inflateRaw(buff, (err, buffer) => {

            if (err)
                console.error(err);
            else
                console.log(buffer.toString()); //here I can see my data!!

        });

        res.status(200).send("POST received!");

    });
});

但是我不认为这解决了...

再次感谢!

Szz。

0 个答案:

没有答案