Project1

标题: 關於load_data的讀取問題 [打印本页]

作者: 土撥撥    时间: 2010-5-19 18:19
标题: 關於load_data的讀取問題
假設我有一個檔案
它像存檔檔案一樣 有至少兩層以上的marshal字串儲存區
我想知道 如何用load_data實現讀取兩層以上字串?
因為我最近試著把該檔案在"製作遊戲安裝檔"過程時一起加密進去
不過我用File.open的方式 似乎因為有加密而讀不到、
也已經清楚只有load_data可以讀取加密過的檔案。
我參閱過說明書了
它只說:
  1. load_data(filename)
  2. 讀取 filename 指定的資料文件,重建目標。

  3. $data_actors = load_data("Data/Actors.rxdata")

  4. 這個函數基本上和 File.open(filename, "rb") { |f|
  5.   obj = Marshal.load(f)
  6. }

  7. 相同,但讀取加密檔案文件內部的文件時會有所不同。
复制代码
不過因為該檔案有兩層以上的字串儲存區
所以用load_data只能讀取到第一層

可是我想要讓它讀取兩層以上的字串
說明書卻不公開讀取的原碼

應該如何讓它讀取呢?
作者: zh99998    时间: 2010-5-23 06:37
有个比较麻烦的方法:用Marshal.load分别读出两层,分别写入文件,然后load_data
作者: 土撥撥    时间: 2010-5-23 20:39
本帖最后由 土撥撥 于 2010-5-23 20:48 编辑

謝謝你的回答,
但是我的用意就是要讓他一次讀取整個檔案(加密檔裡面)
因為我把數據庫的檔案壓縮成5~6個檔案了,
如果再把它Marshal.load、分別寫入文件
就變得跟預設的數據庫儲存方式沒兩樣了....

是否能夠將load_data以某種方式重新定義一遍呢?

作者: zh99998    时间: 2010-5-23 20:47
不太好办嗯,加密档案的是用来加密的,EB自然不会公开其源码
不过加密本身就支持打包多文件了,为什么还要分别存N次,写进一个文件里
直接生成包含那些资料的加密档案不就好吗
作者: 土撥撥    时间: 2010-5-23 20:50
本帖最后由 土撥撥 于 2010-5-23 21:10 编辑

不不不...我認為現在的加密已經沒用了(因為解密器的氾濫)

我想要先用Marshal的方式把壓縮的資料庫合併起來
(創意來自 http://rpg.blue/forum.php?mod=viewthread&tid=137212&extra=page%3D3  )、

再用一層加密(雖然一些人破解得了,但至少能防止另一部份的人)

兩層一起用
作者: zh99998    时间: 2010-5-27 18:46
如果你能知道加密算法,或者拿到了解密器的源码,那么你可以直接open那个文件然后解密
如果你没有解密算法,那还是应该视为那种加密是不可破解的
如果只是为了防解密器的话,随便改改数据结构,就算是简单的把那几个rxdata文件名替换一下,把素材随便找个算法压缩一下,就能唬住不少人了,没必要双加,因为你总得用个的scripts.rxdata或者rgssad来供game.exe调用,这个文件是可以直接看到脚本或者用解包器解密的,你的外层防备无用


作者: 土撥撥    时间: 2010-5-28 21:46
好吧,那我就放棄了..
謝謝你@@
作者: 紫苏    时间: 2010-6-16 14:10
重载一下 load_data,在原 load_data 读取到了第一层后再用你的解密算法扒开第二层不就好了吗?还是说我理解错了…… ><
作者: 土撥撥    时间: 2010-6-20 17:08
回复 紫苏 的帖子


    可是我根本就不知道要怎麼重載啊- -
    根本不知道加密算法要怎麼反過來寫
作者: 紫苏    时间: 2010-6-20 22:59
懵了,你不是说用 load_data 已经读取到第一层了吗,那剩下的第二层不就不是加密的,而只是 Marshal.dump 对象序列化后的字节流了吗?这样的话重定义 load_data,调用原来的 load_data,然后再 Marshal.load 一下不就 OK 了……
作者: 土撥撥    时间: 2010-6-22 18:40
回复 紫苏 的帖子


    可是 重點是..
  1. File.open(filename, "rb") { |f|
  2.   obj = Marshal.load(f)
  3. }
复制代码
第三行已經用了大右括號了

如果再用Marshal.load(f)

就會出問題吧..

另外問一下要怎麼重新定義...
作者: zhangbanxian    时间: 2010-6-22 19:01
我在想既然只是把数据整合到一起,直接弄个数组把所有东西都push进去不是更好...
作者: 紫苏    时间: 2010-6-22 19:28
本帖最后由 紫苏 于 2010-6-23 03:19 编辑

如果是连续多次 Marshal.dump 到一个文件,就可以连续多次 Marshal.load:
Marshal.load(f)
Marshal.load(f)
......
Marshal.load(f)

重定义的方法是:
module Kernel
  alias LOAD_DATA load_data
  def load_data(filename)
    LOAD_DATA(filename)
    # ...
  end
end


我在想既然只是把数据整合到一起,直接弄个数组把所有东西都push进去不是更好... ...
zhangbanxian 发表于 2010-6-22 19:01

弄成数组再 dump 和多次 dump 所有数据也差不了太多:前者可以泛用,用的空间少一点点;前者的数据结构层次可能会很深,在 dump 的时候的一些临时数据,像临时的符号表、对象数据表等也会比后者大很多;前者好处是如果数组中存在相同对象的引用,load 之后仍然保证引用的关系,不过这在读取存档的时候似乎没多大用
作者: 后知后觉    时间: 2010-6-22 20:01
把所有层集合到一个数组或哈希表里




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