我在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);
此代码也提供异常,因为输入无效。
答案 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编码。