Ruby zlib :: Gzip не работает должным образом - PullRequest
0 голосов
/ 11 сентября 2010

Я был в процессе создания системы ввода / экспорта, которая могла бы кодировать структуру данных костюма в дереве XML, а затем считывать ее обратно и воссоздавать объект.Я получил работу xml-части нормально, но когда я обнаружил, что xml-файл был размером 1,5 Мб, а исходный файл ruby ​​:: Marshal был только 105 Кб, я решил, что было бы неплохо сжать файл.поэтому я сделал это

require "rexml/document"
require "zlib"
include REXML

tilesetfile = File.new( "tilesets.rmpy", "w+" )
buffer = ""
tilesetgz = Zlib::GzipWriter.new(tilesetfile)
puts "Compressing output for: tilesets.rxdata ..."
tilesetdoc.write(buffer, 0)
tilesetgz.write(buffer)
tilesetgz.close

, а затем попытался вернуть строку буфера так, чтобы я мог снова сформулировать ее как xml, так что

require "rexml/document"
require "zlib"
include REXML

tilesetfile = File.open("tilesets.rmpy", "r")
tilesetgz = Zlib::GzipReader.new(tilesetfile)
testfile = File.new("importtest.txt", "w")
tilesetdoc = Document.new tilesetgz

следует отметить, что ни один из этихspinets содержит всю систему, только заголовок require и последние несколько строк, которые выполняют сжатие

, но я получаю ошибку формулировки, потому что xml-документ поврежден как-то как

.добавление scrupt импорта до того, как я его распаковал (конечно, файл размером 1,5 МБ)

<tilesetdata>
<tileset>
<id>
1
</id>
<022-Roof01/>
<tileset_name>
019-DesertTown01
</tileset_name>
<autotile_names>
<item>
015-Sa_Water01
</item>
<item>
016-Sa_Shadow01
</item>
<item>
018-Sa_Ground01
</item>
<item>
019-Sa_Grass02
</item>
<item>
020-Sa_Grass03
</item>
<item>
021-Sa_Road01
</item>
<item>
022-Roof01
</item>
</autotile_names>
<panorama_name>
</panorama_name>
<panorama_hue>
0
</panorama_hue>
<fog_name>
</fog_name>
<fog_hue>
0
</fog_hue>
<fog_opacity>
64
</fog_opacity>
<fog_blend_type>
0
</fog_blend_type>
<fog_zoom>
200
</fog_zoom>
<fog_sx>
0
</fog_sx>
<fog_sy>
0
</fog_sy>
<battleback_name>
</battleback_name>
<passages>
<item>
15
</item>
<item>
15
</item>
<item>
15
</item>
<item>
15
</item>
<item>
15
</item>
<item>
15
</item>

на стороне импорта я перехватил файл unGziped, как ни странно, на этот раз файл равен 1,3 МБ

<tilesetdata>
<tileset>
<id>
 1
</id>
<022-Roof01/>
<tileset_name>
019-DesertTown01
</tileset_name>
<autotile_names>
<item>
015-Sa_Water01
</item>
<item>
016-Sa_Shadow01
</item>
<item>
018-Sa_Ground01
</item>
<item>
019-Sa_Grass02
</item>
<item>
020-Sa_Grass03
</item>
<item>
021-Sa_Road01
</item>
<item>
022-Roof01
</item>
</autotile_names>
<panorama_name>
</panorama_name>
<panorama_hue>
0
</panorama_hue>
<fog_name>
</fog_name>
<fog_hue>
0
</fog_hue>
<fog_opacity>
64
</fog_opacity>
<fog_blend_type>
0
</fog_blend_type>
<fog_zoom>
200
</fog_zoom>
<fog_sx>
0
</fog_sx>
<fog_syy>
0
</fog_sx>
<fog_syy>
0
</fog_sx>
<fog_syy>
0
</fog_sx>
<fog_syy>
0
</fog_sx>
<fog_syy>
0
</fog_sx>

Начиная с

искажение оригинала становится только хуже, чтобы уточнить, я запустил скрипт импорта, и он сгенерировал файл tilesets.rmpy (размером 18 КБ), а я запустил импортпроверить систему и обнаружить это.

Есть идеи, что случилось?или если нет, как это исправить, альтернатива?

1 Ответ

1 голос
/ 11 сентября 2010

Похоже, что Gzip правильно работает только с файлами, открытыми в двоичном режиме

require "rexml/document"
require "zlib"
include REXML

tilesetfile = File.new( "tilesets.rmpy", "wb" )
buffer = ""
tilesetgz = Zlib::GzipWriter.new(tilesetfile)
puts "Compressing output for: tilesets.rxdata ..."
tilesetdoc.write(buffer, 0)
tilesetgz.write(buffer)
tilesetgz.close

и

require "rexml/document"
require "zlib"
include REXML

tilesetfile = File.open("tilesets.rmpy", "rb")
tilesetgz = Zlib::GzipReader.new(tilesetfile)
tilesetdoc = Document.new tilesetgz.read.to_s

работал без проблем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...