У меня есть сжатый буфер данных с помощью функции php gzcompress, и мне нужно распаковать его в js (nodejs).
gzcompress(serialize($slot[$i]['advanced_details']),8)
Я пробовал Класс: zlib.Gunzip из https://nodejs.org/api/zlib.html#zlib_class_zlib_gunzip
Но это бросает:
{ [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
Полный буфер Вот
Мой код:
nodeZlib.gunzip(rows[0]['Slot'+(i+1)+'AdvancedDetails'], 8, function(error, data) {
if(!error) {
console.log = data.toString();
} else {
console.log('Error unzipping:');
console.log(error);
}
});
Что я делаю неправильно?
Вы путаете форматы. Вашей путанице помогает ужасное именование функций в PHP. РНР gzcompress()
создает формат zlib, тогда как файл node.js gunzip
ожидает формат GZIP. Вы могли бы использовать gzencode()
вместо этого в PHP, чтобы сгенерировать формат gzip, или вы можете использовать node.js zlib.inflate
распаковать формат zlib.
Я пытался минимизировать вывод json из команды оболочки. Это было слишком долго без кодирования.
Решение, к которому я прибыл:
$content = ['sample', 'data'];
$data = base64_encode(gzencode(
json_encode($content, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE),
8,
FORCE_DEFLATE
));
// then send $data to node
и получить данные в узле:
const zlib = require('zlib');
let data = zlib.inflateSync(new Buffer(data.min, 'base64')).toString();