【问题标题】:Why size of a string compressed by LZMA-JS is approx. 10x bigger then before the compression为什么 LZMA-JS 压缩的字符串大小约为。比压缩前大 10 倍
【发布时间】:2023-03-27 19:02:01
【问题描述】:

我正在尝试找到一种方法来减小发送到服务器的 BASE64 编码图像的大小。我发现question LZMA 是建议的解决方案。但是,当我在服务器上检查请求大小时,我发现未压缩版本的大小大约小了 10 倍。我错过了一步吗?我看到压缩的结果是Byte Array 我尝试使用.toString('utf8') 方法,但它似乎只是加入数组。

/* LZMA COMPRESS / DECOMPRESS */
.factory('ooLZMA', ['CONFIG', function (CONFIG) {
  return {
    compress: function (string) {
       return LZMA.compress(string, CONFIG.stringCompression);
    },
    decompress: function () {
      return LZMA.decompress(string);
    }
  }
}])

在服务器上:

console.log('size', req.headers['content-length'] / 1048576, 'comp', req.body.compressed);

//"compressed"
size 0.1276998519897461 comp true
//raw BASE64
size 0.01657390594482422 comp false

【问题讨论】:

  • 有两个问题可能会导致该问题。 1. 如果您阅读了您提到的问题的已接受答案,您可以看到 LZMA JS 库正在创建一个有符号字节数组,而服务器正在使用一个无符号字节数组。 2.在base64编码之前图片是什么格式的,很多图片格式已经被压缩了,所以base64编码然后压缩结果字符串几乎肯定会增加数据的大小。

标签: javascript compression base64 lzma


【解决方案1】:

这是由于格式转换造成的。 如果您发送 BASE64 编码,则它已经是一个字符串,并按原样发送到服务器。 而是在实际请求之前将数组转换为字符串。 如果您的数据不能压缩太多,则压缩后的数据将具有相似的大小,但字符串转换操作会增加它,因为每个数字平均为 10/12 个字符长。

如果您使用的是 jquery,我认为这是发布数据的正确方法。

Sending binary data in javascript over HTTP

通过设置实际内容类型“application/octet-stream”并避免预处理/转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2010-11-24
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多