2013-02-23 2 views
-1

Я пытаюсь сохранить сжатые строки в файл и загрузить их позже для использования в игре. Я продолжал получать ошибки «in» finish: error error при загрузке резервных копий данных для использования. Я придумал это:Ошибка взлома Zlib

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:» продолжает работать нормально. Что здесь происходит?

ответ

1

В файле testzip.txt вы сохраняете разделенные друг за другом бинарные капли. Тем не менее, двоичные капли могут содержать новые строки сами по себе, поэтому, когда вы открываете testzip.txt и разделяете его по строке, вы можете в итоге разделить один двоичный код, который inflate поймет, на два бинарных капли, которые он не понимает.

Попробуйте запустить wc -l testzip.txt после получения ошибки. Вы увидите, что файл содержит еще одну строку, чем количество строк, которые вы вставляете.

Что вам нужно сделать, это сжатие всего файла сразу, а не строка за строкой.

+0

Итак, что-то вроде: writeFile = "hello world" + "\ n", а затем deflate writeFile, когда вы его пишете? Потому что это все еще вызывает ту же ошибку. – user1796160

+0

Это и раздувает весь файл сразу, а не по строкам. – Tobi

+0

Да, вот что я имел в виду. Вводя все это в одну переменную и раздувая это. Но это все еще вызывает ошибку. :/ – user1796160