Node.js 使用brotli压缩和解压缩utf8字符串
我正在尝试编写压缩和解压缩JSON字符串,但解压缩总是失败,原因是: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作为格式,那么除了字符串输出之外,其他都可以工作,但比简
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"));
您将在不同的缓冲区中看到往返结果。也许这个抽象将对您有所帮助。希望能有帮助。也许这个抽象会对你有所帮助。希望能有帮助。