赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 1048 |
最后登录 | 2023-1-7 |
在线时间 | 18 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 95
- 在线时间
- 18 小时
- 注册时间
- 2008-1-22
- 帖子
- 46
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 土撥撥 于 2011-2-18 18:39 编辑
今天總算研究出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分別輸出到一個新的文本即可。 |
|