首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用brotli压缩utf8字符串

用brotli压缩utf8字符串
EN

Stack Overflow用户
提问于 2019-12-03 08:02:20
回答 1查看 5.9K关注 0票数 2

我试图编写、压缩和解压缩JSON字符串,但是解压总是失败的:

代码语言:javascript
复制
Error: Decompression failed
    at BrotliDecoder.zlibOnError [as onerror] (zlib.js:170:17) {
  errno: -6,
  code: 'ERR_CL_SPACE'
}

我无法发送压缩程序返回的缓冲区,因为我需要通过HTTP响应发送压缩的字符串才能返回它。

而且,如果我使用base64作为格式,除了字符串输出之外,所有的工作都要比简单的JSON.stringify大,所以我会避免使用它。

我的代码:

代码语言:javascript
复制
const zlib = require('zlib')

function compress (json) {
  zlib.brotliCompress(JSON.stringify(json), {
    params: {
      [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT
    }
  }, (err, data) => {
    console.log(err)
    console.log(data.toString('utf8'))
    console.log('-------------------------------')
    decompress(Buffer.from(data.toString('utf8'), 'utf8'))
  })
}

function decompress (str) {
  zlib.brotliDecompress(str, (err, data) => {
    console.log(err)
    console.log(data)
  })
}

const obj = {
  wt: '5de52e98aa54253147060a01',
  ex: ['b9ac4a6b-2e72-4bf3-abd5-debf2ece4ba4']
}
compress(obj)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-03 10:07:52

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

在任何情况下,压缩和解压缩工作时,我们把我们的压缩数据作为base64。

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

代码语言:javascript
复制
const zlib = require('zlib')

// Encode the buffer in base 64. UCS2 will work, but UTF8 will not.
const encoding = "base64";

function compress (json) {
  zlib.brotliCompress(JSON.stringify(json), {
    params: {
      [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT
    }
  }, (err, data) => {
    if (err) {
      console.error("brotliCompress: An error occurred:", err);
    } else {
      console.log("Compressed data:", data.toString("base64"));
      console.log('-------------------------------')
      decompress(data.toString(encoding), encoding);
    }
  })
}

function decompress (encodedData, encoding) {
  const compressedData = Buffer.from(encodedData, encoding);
  zlib.brotliDecompress(compressedData, (err, data) => {
    if (err) {
      console.error("brotliDecompress: An error occurred:", err);
    } else {
      console.log("Decompressed data:", data.toString("utf8"));
    }
  });
}

const obj = {
  wt: '5de52e98aa54253147060a01',
  ex: ['b9ac4a6b-2e72-4bf3-abd5-debf2ece4ba4']
}

compress(obj);

要显示Buffer.from(data.toString("utf8")、"utf8")并不总是可逆的:

代码语言:javascript
复制
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"));

您将看到往返会产生不同的缓冲区。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59152541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档