我正在尝试将压缩字符串保存到文件中,然后加载它们以便在游戏中使用。在加载数据备份以供使用时,我一直收到“在'完成':缓冲区错误”错误。我想出了这个:
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:”等继续抛出缓冲区错误,而“Setting:”或“Thing:”之类的工作正常,而将设置行更改为“Taggedskill:”继续正常工作。这是怎么回事?
答案 0 :(得分:1)
在testzip.txt中,您将存储换行符分隔的二进制blob。但是,二进制blob本身可能包含换行符,因此当您打开testzip.txt并按行拆分时,最终可能会将inflate
理解的一个二进制blob拆分为两个不理解的二进制blob。
尝试在收到错误后运行wc -l testzip.txt
。您将看到该文件包含的行数多于您输入的行数。
您需要做的是立即压缩整个文件,而不是逐行压缩。