我试图将我编写的Ruby脚本转换为Node.js,但我的zlib压缩输出是大的(1580字节而不是62 ruby给我)。我压缩的内容非常均匀,10,000字节的数据可以是65或122。
红宝石:
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}"
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。有什么区别?
两者的标题字节是&#34; 78 9C&#34;所以他们应该使用相同的压缩
答案 0 :(得分:1)
看来你在for
循环之后没有检查你的node.js缓冲区,看它是不是你想的那样。您的偏移量是i*j-1
?也许你的意思是i*100 + j - 101
?或者更好的是,为了避免不必要的计算,只需在for循环之前设置k = 0
并进行偏移k++
。