Project1

标题: 关于Script.rxdata中的Deflate算法 [打印本页]

作者: 熊猫    时间: 2011-2-16 01:13
标题: 关于Script.rxdata中的Deflate算法
本帖最后由 熊猫 于 2011-2-16 01:14 编辑

实验了N次,完全可以读scripts.rxdata结构了,相关数据也可以读出来。
最后一步就是对实质脚本内容进行解压缩,搜索了一下发现,很多帖子提到了这个Deflate。
http://rpg.blue/thread-139590-1-1.html
http://www.66rpg.com/htm/news343.htm
http://rpg.blue/thread-5279-1-1.html
通过看WIKI貌似也看出来这是ZIP的算法,可我就是解不开啊…………
我使用.NET开发,里面有一个DeflateStream,可是我解的时候提示“块的长度与它的补集不匹配”,暂且不管这个。我发现这个.NET的DeflateStream没有Level的设置,估计是不能用这个类。
我又找到了一个很强大的.NET专用库"ICSharpCode.SharpZipLib.dll",这里面东西好多好多,找到了一个叫Deflater的,有Level设置……还是解不开~
我不可能用RUBY的那个Zlib::Deflate.deflate(string, level),我就是想知道.NET的话怎么解开这个。

还有大家有没有关于这个Deflate的更详细的内容,例如指定的算法名称,这里有很多算法例如GZIP、BZIP、ZIP……
传上来我所分析的Scripts.rxdata,还有一个从里面弄出来让我扒干净的被Deflated的数据文件,我想解压后这个就应该是我Main脚本的内容。(那个扩展名不用管,我瞎起的,主要是里面的数据)
Desktop.rar (118.61 KB, 下载次数: 69)
还有Main脚本的实际内容:
  1. #==============================================================================
  2. # ■ Main
  3. #------------------------------------------------------------------------------
  4. #  各定义结束后、从这里开始实际处理。
  5. #==============================================================================

  6. begin
  7.   @a = load_data("Data/Scripts.rxdata")#.to_s
  8.   p @a
  9.   f = File.open("test2.txt","wb+")
  10.   f.write(@a.inspect)
  11.   f.close
  12.   # 准备过渡
  13.   # 设置系统默认字体
  14.   Font.default_name = (["黑体"])
  15.   Graphics.freeze
  16.   # 生成场景对像 (标题画面)
  17.   $scene = Scene_Title.new
  18.   # $scene 为有效的情况下调用 main 过程
  19.   while $scene != nil
  20.     $scene.main
  21.   end
  22.   # 淡入淡出
  23.   Graphics.transition(20)
  24. rescue Errno::ENOENT
  25.   # 补充 Errno::ENOENT 以外错误
  26.   # 无法打开文件的情况下、显示信息后结束
  27.   filename = $!.message.sub("No such file or directory - ", "")
  28.   print("找不到文件 #{filename}。 ")
  29. end
复制代码
请大家帮忙了,谢谢!dsu_plus_rewardpost_czw
作者: 苏小脉    时间: 2011-2-16 06:12
本帖最后由 苏小脉 于 2011-2-16 06:18 编辑

DEFLATE 是一种压缩算法;gzip 是一种软件或存档格式,多数情况下是指 GNU 的 gzip(此外还有各种 BSD 平台下的 gzip,实现不同),也可以指 gzip 专用的存档格式,这些都支持 DEFLATE 压缩;bzip2 支持 DEFLATE,但似乎也支持别的算法;zip 是存档文件格式,支持 DEFLATE。

要注意的是 Zlib 会对原始的 DEFLATE 数据进行封装,开头有一个数据头和数据尾,而这个头不是压缩算法的标准,而是 Zlib 的标准。gzip、bzip2 也有各自的标准,所以尽管压缩算法相同,最后的结果还是会有出入的,最多是 payload 一样。

.NET 的 DeflateStream 想必只是一个提供 DEFLATE 算法的类,没有针对某种存档格式的处理。同一个命名空间下还有个 GZipStream,想必就是针对 gzip 文件格式的了。Zlib 估计没包含在在官方的库中,但 Zlib 及其标准本身就是从一个库发展起来的,要解压 Zlib 压缩的数据,自然是用 Zlib 本身了。RM 调用的是 Ruby 的标准库中的 Zlib,底层用的也是 zlib 官方的库实现。直接把官网的实现拽过来,然后调用就行了嘛。

zlib 官网:http://zlib.net/
提供源码和预编译的 DLL。
手册:http://www.zlib.net/manual.html

另外:
DEFLATE 算法:http://www.ietf.org/rfc/rfc1951.txt
不过由于 RFC 是 memo,所以语言比较正式,wikipedia 的这个可能更读者友好些:http://en.wikipedia.org/wiki/DEFLATE
作者: tamashii    时间: 2011-2-16 11:51
本帖最后由 tamashii 于 2011-2-16 11:51 编辑

.Net可以去ICSharpCode网站弄个ICSharpZIPLib
http://www.sharpdevelop.org
关于这个类库在网上有很多教程
作者: 熊猫    时间: 2011-2-16 21:48
回复 苏小脉 的帖子

谢了,那个Zlib果然是重点。
http://zlib.net/中的那个zlib for .NET in C#
太好用了,我都没输入什么Level,直接用范例的Decompress函数就解开了。。。
本来没报什么希望,不过竟然看到输出文件就是脚本内容,激动。
decompressFile("E:\1.deflated", "E:\2.txt")




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1