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++
.
我正在尝试将我编写的 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++
.