2012-04-08 74 views
0
def deflate(string, level) 
    z = Zlib::Deflate.new(level) 
    dst = z.deflate(string, Zlib::NO_FLUSH) 
    z.close 
    return dst 
end 

def inflate(string) 
    zstream = Zlib::Inflate.new 
    buf = zstream.inflate(string) 
    zstream.finish 
    zstream.close 
    return buf 
end 

a = deflate("asasasas",6) 
p a 
p inflate(a) 

給我就行的Zlib膨脹緩衝區錯誤

zstream.finish 

爲什麼是一個緩衝區錯誤?我相信Ruby 1.8.7。

回答

0

上放氣文檔說:

一般情況下,參數沖水設置爲Z_NO_FLUSH,允許 放氣的多少來定的數據,以便最大限度地壓縮生產輸出, 之前積累。

通過使用Zlib :: NO_FLUSH,返回的值不是整個放氣的流。改爲使用Zlib :: FINISH

你寫的函數是在Zlib :: Deflate/Zlib :: Inflate文檔中提供的函數。你可以替換你所寫的所有代碼:

a = Zlib::Deflate.deflate("asasasas", 6) 
p a 
p Zlib::Inflate.inflate(a) 
+0

如果我使用Zlib :: Inflate.inflate(a)它會引發緩衝區錯誤。這就是爲什麼我決定寫這些方法。現在,當我使用Zlib :: FINISH而不是zstream.finish時,只是返回一個空字符串。 – Voldemort 2012-04-09 04:17:22

+0

我測試過它對1.9.2。也許它在不同的ruby版本上有不同的表現?正如你剛纔所說的那樣,你是否在使用1.8.7? – 2012-04-09 16:44:41

+0

剛剛在1.8.7上測試過它,它工作(使用** ruby​​ -rzlib -e'p Zlib :: Inflate.inflate(Zlib :: Deflate.deflate(「asasasas」,6))** **)走着瞧吧。 – 2012-04-09 16:48:40