将缓冲区转换为字符串,然后在javascript

时间:2018-02-14 17:53:25

标签: node.js string compression buffer zlib

我在NODEJS中使用ZLIB来压缩字符串。在压缩字符串时,我得到一个BUFFER。我想将该缓冲区作为PUT请求发送,但PUT请求拒绝BUFFER,因为它只需要STRING。我无法将BUFFER转换为STRING,然后在接收端我无法解压缩该字符串,因此我可以获取原始数据。我不知道如何将缓冲区转换为字符串,然后将该字符串转换为缓冲区,然后解压缩缓冲区以获取原始字符串。

let zlib = require('zlib');
// compressing 'str' and getting the result converted to string
let compressedString = zlib.deflateSync(JSON.stringify(str)).toString();

//decompressing the compressedString
let decompressedString = zlib.inflateSync(compressedString);

最后一行导致输入无效的问题。

我试图转换' compressedString'到缓冲区,然后解压缩它然后也没有帮助。

//converting string to buffer
let bufferedString = Buffer.from(compressedString, 'utf8');
//decompressing the buffer
//decompressedBufferString = zlib.inflateSync(bufferedString);

此代码也提供异常,因为输入无效。

2 个答案:

答案 0 :(得分:1)

我会阅读zlib的文档,但用法很清楚。

var Buffer = require('buffer').Buffer;
var zlib = require('zlib');

// create the buffer first and pass the result to the stream
let input = new Buffer(str);

//start doing the compression by passing the stream to zlib
let compressedString = zlib.deflateSync(input);

// To deflate you will have to do the same thing but passing the 
//compressed object to inflateSync() and chain the toString()
let decompressedString = zlib.deflateSync(compressedString).toString();

有许多方法可以处理流,但这是您尝试使用提供的代码实现的目标。

答案 1 :(得分:0)

尝试将缓冲区作为latin1字符串而不是utf8字符串发送。例如,如果您的缓冲区位于mybuf变量中:

mybuf.toString('latin1');

并将mybuf发送到您的API。然后,在您的前端代码中,您可以执行以下操作,假设您的响应位于response变量中:

const byteNumbers = new Uint8Array(response.length);
for (let i = 0; i < response.length; i++) {
  byteNumbers[i] = response[i].charCodeAt(0);
}
const blob: Blob = new Blob([byteNumbers], {type: 'application/gzip'});

根据我的经验,与发送缓冲区相比,这种方式传输的大小会稍高,但是至少与utf8不同,您可以恢复原始二进制数据。根据{{​​3}},我仍然不知道如何使用utf8编码。