Node.js zlib.deflate 输出太长

Node.js zlib.deflate output too long

我正在尝试将我编写的 Ruby 脚本转换为 Node.js,但我的 zlib 压缩输出太大(1580 字节而不是 62 ruby 给我).我压缩的很统一,10000字节的数据可以是65也可以是122

Ruby:

rimg = []
(1..100).each do |i|
  (1..100).each do |j|
    rimg << ((j > 20 && j < 30) || (j > 70 && j < 80) ? 65 : 122)
  end
end

zd = Zlib::Deflate.new(Zlib::DEFAULT_COMPRESSION, Zlib::MAX_WBITS)
ximg = zd.deflate(rimg.pack('c*'), Zlib::FINISH)
zd.close
puts "bytesize #{ximg.bytesize}"

字节大小为 62 字节。这是我的 JS:

  var rimg = new Buffer(100*100);
  rimg.fill(0);

  for (var i = 1; i <= 100; i++) {
    for (var j = 1; j <= 100; j++) {
      rimg.writeInt8((((j > 20 && j < 30) || (j > 70 && j < 80) ? 65 : 122)), i*j-1);
    }
  }

  Zlib.deflate(rimg, { windowBits: 15 }, function(err, result) {
    console.log('-------')
    console.log(result.length);
  });

这输出1580。节点版本是5.1.1。有什么区别?

两者的 header 字节都是“78 9C”,因此它们应该使用相同的压缩方式

您似乎没有在 for 循环后检查 node.js 缓冲区,看它是否真的如您所想。你的偏移量是i*j-1?也许你的意思是 i*100 + j - 101?或者更好的是,为了避免不必要的计算,只需在 for 循环之前设置 k = 0 并使偏移量 k++.