Project1
标题:
關於load_data的讀取問題
[打印本页]
作者:
土撥撥
时间:
2010-5-19 18:19
标题:
關於load_data的讀取問題
假設我有一個檔案
它像存檔檔案一樣 有至少兩層以上的marshal字串儲存區
我想知道 如何用load_data實現讀取兩層以上字串?
因為我最近試著把該檔案在"製作遊戲安裝檔"過程時一起加密進去
不過我用File.open的方式 似乎因為有加密而讀不到、
也已經清楚只有load_data可以讀取加密過的檔案。
我參閱過說明書了
它只說:
load_data(filename)
讀取 filename 指定的資料文件,重建目標。
$data_actors = load_data("Data/Actors.rxdata")
這個函數基本上和 File.open(filename, "rb") { |f|
obj = Marshal.load(f)
}
相同,但讀取加密檔案文件內部的文件時會有所不同。
复制代码
不過因為該檔案有兩層以上的字串儲存區
所以用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
回复
紫苏
的帖子
可是 重點是..
File.open(filename, "rb") { |f|
obj = Marshal.load(f)
}
复制代码
第三行已經用了大右括號了
如果再用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