Zlib nodejs Ошибка: неверная длина сохраненного блока - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь отправить некоторые сжатые данные по сети, я думаю, что данные успешно сжаты, так как я могу повторно раздувать их из кода, который дефлирует данные (записанные на C), однако, когда данные поступают в мойсервер (nodejs использует экспресс) и пытается раздуть данные, которые я получаю:

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

Любая помощь будет очень признательна, заранее спасибо.

Szz.

PD: я могу предоставить отсканированный код, если он будет полезен для всех.

РЕДАКТИРОВАТЬ:

Спасибо за быстрый ответ и извините за задержку, я былработая в моем коде, теперь я отправляю исходные данные на сервер вместе со сжатыми данными.Когда исходные данные поступают на сервер, я дефлятирую их, чтобы увидеть сгенерированные буферы. Удивительно, но буферы сжатых данных, отправленных по сети, и буфер, сжатый на сервере, совпадают , за исключением двух первых байтов частности:

<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, часть узла просто огромна, анализируя пост-ввод и немного поработав с буферами.

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   

Однако, создав новый буфер без первых двух байтов, я могу правильно разместить свои данные на сервере:

my node.js part:

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.

...