じ☆ve冰风 发表于 2024-4-19 19:21:34

Marshal-指定讀取其他層資料

今天總算研究出Marshal的脫離順序讀取方法了...

其實Marshal 根本不一定要照著第一層、第二層、第三層的順序讀取,

不過今天要教各位的方法有點麻煩,

因為這並不是直接找出第n層的位置,

而是在檔案儲存的時候,將pos記錄下來,再從pos(文件指針)下手。

首先這個腳本是測試專用的,

這段代碼代表將字串壓縮、並分別以Marshal的方式存入001.rxdata 這個檔案,

並在儲存前、儲存後各彈出寫著當前文件指針的窗口。@f = File.open("001.rxdata","wb")print @f.posMarshal.dump(Zlib::Deflate.deflate("測試字串一號"),@f)print @f.posMarshal.dump(Zlib::Deflate.deflate("測試字串二號"),@f)print @f.posMarshal.dump(Zlib::Deflate.deflate("測試字串三號"),@f)print @f.pos@f.close复制代码以上腳本測試過後,

彈出結果順序如下:

0,33,66,99

接著我們便取得了三個壓縮過後的字串的位置:

0~33 這段為壓縮過後的"測試字串一號"
33~66 這段為壓縮過後的"測試字串二號"
66~99 這段為壓縮過後的"測試字串三號"

所以我們可以知道結構大約如圖:


接著我們實際測試:@f = File.open("001.rxdata","rb")@f.pos = 66 # 將文件指針設定至測試字串三號的起始位置:66print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串三號@f.pos = 33 # 將文件指針設定至測試字串二號的起始位置:33print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串二號@f.pos = 0 # 將文件指針設定至測試字串一號的起始位置:0print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串一號@f.close复制代码我們直接將文件指針手動設定至該資料的起始位置,

再行Marshal.load,

我們就可以發現,讀取的層數位置可以任意調整!



另外說明一下:如果要存的層數很多,

就把它改成將@f.pos分別輸出到一個新的文本即可。
             本帖来自P1论坛作者土撥撥,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=167955若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页: [1]
查看完整版本: Marshal-指定讀取其他層資料