-1

圧縮された文字列をファイルに保存し、後で読み込んでゲームで使用しようとしています。データをロードして使用するときに、「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:」などに変更しようとすると、引き続きバッファ エラーがスローされますが、「Setting:」や「Thing:」などは正常に機能しますが、設定行を "Taggedskill:" に変更すると、引き続き正常に動作します。ここで何が起こっているのですか?

4

1 に答える 1

1

testzip.txtには、改行で区切られたバイナリブロブを格納しています。ただし、バイナリブロブにはそれ自体に改行が含まれている可能性があるため、testzip.txtを開いて行ごとに分割すると、理解できる1つのバイナリブロブinflateが理解できない2つのバイナリブロブに分割される可能性があります。

wc -l testzip.txtエラーが発生した後に実行してみてください。入力している行数よりも1行多いファイルが含まれていることがわかります。

あなたがする必要があるのは、行ごとではなく、ファイル全体を一度に圧縮することです。

于 2013-02-23T04:38:19.723 に答える