Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用brotli压缩和解压缩utf8字符串_Node.js_Brotli - Fatal编程技术网

Node.js 使用brotli压缩和解压缩utf8字符串

Node.js 使用brotli压缩和解压缩utf8字符串,node.js,brotli,Node.js,Brotli,我正在尝试编写压缩和解压缩JSON字符串,但解压缩总是失败,原因是: Error: Decompression failed at BrotliDecoder.zlibOnError [as onerror] (zlib.js:170:17) { errno: -6, code: 'ERR_CL_SPACE' } 我无法发送压缩器返回的缓冲区,因为我需要通过HTTP响应发送压缩字符串以将其返回 此外,如果我使用base64作为格式,那么除了字符串输出之外,其他都可以工作,但比简

我正在尝试编写压缩和解压缩JSON字符串,但解压缩总是失败,原因是:

Error: Decompression failed
    at BrotliDecoder.zlibOnError [as onerror] (zlib.js:170:17) {
  errno: -6,
  code: 'ERR_CL_SPACE'
}
我无法发送压缩器返回的缓冲区,因为我需要通过HTTP响应发送压缩字符串以将其返回

此外,如果我使用
base64
作为格式,那么除了字符串输出之外,其他都可以工作,但比简单的
JSON.stringify
更大,因此我会避免使用它

我的代码:

const zlib=require('zlib'))
函数压缩(json){
zlib.brotliCompress(JSON.stringify(JSON){
参数:{
[zlib.constants.BROTLI_参数_模式]:zlib.constants.BROTLI_模式_文本
}
},(错误,数据)=>{
console.log(错误)
console.log(data.toString('utf8'))
console.log('-------------------------------------')
解压缩(Buffer.from(data.toString('utf8'),'utf8'))
})
}
函数解压缩(str){
zlib.brotliDecompress(str,(err,data)=>{
console.log(错误)
console.log(数据)
})
}
常量对象={
wt:'5DE52E98AA5425314706A01',
例如:['b9ac4a6b-2e72-4bf3-abd5-debf2ece4ba4']
}
压缩(obj)

是否有任何参数可以从压缩中获得有效的utf8字符串输出?

我认为您必须使用base64通过线路发送数据。在任何情况下,这将导致大约37%的大小损失。这实际上可能比发送UTF8更有效,因为许多字节需要多字节编码(在发送二进制数据时)

在任何情况下,当我们将压缩数据作为base64传递时,压缩和解压缩都会起作用

我相信它不使用UTF8的原因是,将缓冲区转换为UTF8并再次返回并不总是可逆的,也就是说,您不一定会返回相同的结果(尝试将随机数据编码为UTF8并再次返回!)

要显示Buffer.from(data.toString(“utf8”),“utf8”)并不总是可逆的:

const crypto = require("crypto");
const data = crypto.randomBytes(100);

console.log("Bytes (base64):", data .toString("base64"));

const encoding = "utf8";
const dataUtf8 = data.toString(encoding);
const decoded = Buffer.from(dataUtf8, encoding);
console.log("Bytes (base64 decoded):", decoded.toString("base64"));

您将在不同的缓冲区中看到往返结果。

我认为您必须使用base64通过线路发送数据。在任何情况下,这将导致约37%的大小损失。这实际上可能比发送UTF8更有效,因为许多字节需要多字节编码(在发送二进制数据时)

在任何情况下,当我们将压缩数据作为base64传递时,压缩和解压缩都会起作用

我相信它不使用UTF8的原因是,将缓冲区转换为UTF8并再次返回并不总是可逆的,也就是说,您不一定会返回相同的结果(尝试将随机数据编码为UTF8并再次返回!)

要显示Buffer.from(data.toString(“utf8”),“utf8”)并不总是可逆的:

const crypto = require("crypto");
const data = crypto.randomBytes(100);

console.log("Bytes (base64):", data .toString("base64"));

const encoding = "utf8";
const dataUtf8 = data.toString(encoding);
const decoded = Buffer.from(dataUtf8, encoding);
console.log("Bytes (base64 decoded):", decoded.toString("base64"));

您将在不同的缓冲区中看到往返结果。

也许这个抽象将对您有所帮助。希望能有帮助。也许这个抽象会对你有所帮助。希望能有帮助。