| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 1048 |  
| 最后登录 | 2023-1-7 |  
| 在线时间 | 18 小时 |  
 Lv1.梦旅人 
	梦石0 星屑95 在线时间18 小时注册时间2008-1-22帖子46 | 
| 
本帖最后由 土撥撥 于 2011-2-18 18:39 编辑
x
加入我们,或者,欢迎回来。您需要 登录 才可以下载或查看,没有帐号?注册会员  
 今天總算研究出Marshal的脫離順序讀取方法了...
 
 其實Marshal 根本不一定要照著第一層、第二層、第三層的順序讀取,
 
 不過今天要教各位的方法有點麻煩,
 
 因為這並不是直接找出第n層的位置,
 
 而是在檔案儲存的時候,將pos記錄下來,再從pos(文件指針)下手。
 
 首先這個腳本是測試專用的,
 
 這段代碼代表將字串壓縮、並分別以Marshal的方式存入001.rxdata 這個檔案,
 
 並在儲存前、儲存後各彈出寫著當前文件指針的窗口。
 以上腳本測試過後,复制代码@f = File.open("001.rxdata","wb")
print @f.pos
Marshal.dump(Zlib::Deflate.deflate("測試字串一號"),@f)
print @f.pos
Marshal.dump(Zlib::Deflate.deflate("測試字串二號"),@f)
print @f.pos
Marshal.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 # 將文件指針設定至測試字串三號的起始位置:66
print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串三號
@f.pos = 33 # 將文件指針設定至測試字串二號的起始位置:33
print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串二號
@f.pos = 0 # 將文件指針設定至測試字串一號的起始位置:0
print Zlib::Inflate.inflate(Marshal.load(@f)) # 讀取後解壓並彈出 => 測試字串一號
@f.close
 再行Marshal.load,
 
 我們就可以發現,讀取的層數位置可以任意調整!
 
 
 
 
 另外說明一下:如果要存的層數很多,
 
 就把它改成將@f.pos分別輸出到一個新的文本即可。
 | 
 |