Project1

标题: Marshal-指定讀取其他層資料 [打印本页]

作者: 土撥撥    时间: 2011-2-18 18:27
标题: Marshal-指定讀取其他層資料
本帖最后由 土撥撥 于 2011-2-18 18:39 编辑

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

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

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

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

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

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

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

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

彈出結果順序如下:

0,33,66,99

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

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

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


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

再行Marshal.load,

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

[line]1[/line]

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

就把它改成將@f.pos分別輸出到一個新的文本即可。
作者: DeathKing    时间: 2011-2-18 18:45
http://rpg.blue/thread-139590-1-1.html




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