Ruby Zlib充气误差

Ruby Zlib充气误差,ruby,compression,zlib,inflate,deflate,Ruby,Compression,Zlib,Inflate,Deflate,我正在尝试将压缩字符串保存到一个文件中,并在以后加载它们以便在游戏中使用。在加载数据以备使用时,我不断收到“in'finish':buffer error”错误。我想到了这个: require "zlib" def deflate(string) zipper = Zlib::Deflate.new data = zipper.deflate(string, Zlib::FINISH) end def inflate(string)

我正在尝试将压缩字符串保存到一个文件中,并在以后加载它们以便在游戏中使用。在加载数据以备使用时,我不断收到“in'finish':buffer error”错误。我想到了这个:

    require "zlib"

    def deflate(string)
      zipper = Zlib::Deflate.new
      data = zipper.deflate(string, Zlib::FINISH)
    end

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

    setting = ["nothing","nada","nope"]
    taggedskills = ["nothing","nada","nope","nuhuh"]

    File.open('testzip.txt','wb') do |w|
        w.write(deflate("hello world")+"\n")
        w.write(deflate("goodbye world")+"\n")
        w.write(deflate("etc")+"\n")
        w.write(deflate("etc")+"\n")
        w.write(deflate("Setting: name "+setting[0]+" set"+(setting[1].class == String ? "str" : "num")+" "+setting[1].to_s)+"\n")
        w.write(deflate("Taggedskill: "+taggedskills[0]+" "+taggedskills[1]+" "+taggedskills[2]+" "+taggedskills[3])+"\n")
        w.write(deflate("etc")+"\n")
    end

    File.open('testzip.txt','rb') do |file|
        file.each do |line|
            p inflate(line)
        end
    end

它在“Taggedskill:”点上抛出错误。我不知道它是什么,但尝试将其更改为“Skilltag:”、“Skillt:”等会继续抛出缓冲区错误,而像“设置:”或“事情:”这样的操作可以正常工作,而将设置行更改为“Taggedskill:”则可以正常工作。这是怎么回事?

在testzip.txt中,您存储的是换行符分隔的二进制blob。但是,二进制blob本身可能包含换行符,因此当您打开testzip.txt并按行拆分它时,您可能会最终将一个
inflate
可以理解的二进制blob拆分为两个它不理解的二进制blob

出现错误后,尝试运行wc-l testzip.txt。您将看到该文件比您输入的行数多包含一行


您需要做的是一次压缩整个文件,而不是一行一行地压缩。

那么,像这样的事情:writeFile=“hello world”+“\n”,然后在编写时压缩writeFile?因为这仍然会抛出相同的错误。那,并立即膨胀整个文件,而不是一行一行。是的,这就是我的意思。把所有这些都放在一个变量中,然后膨胀。但这仍然会带来一个错误/当然,顺便说一句,我非常感谢你的帮助!