剛好要碰到比較基層的位元讀取
所以坎尼把一點點小小心得給寫出來
首先,要講的是 Stream 類別
Stream 在 .NET 2.0 裡又分為很多種
有 FileStream、MemoryStream、BufferStream...
但一般常用的應該是 FileStream 類 用來將檔案內容讀出
再來就是存取資料的容器 (直接用 FileStream 也有 Read 函式)
不過這次由於處理的資料需要將位元抓取出來 並換轉成數字或文字
所以坎尼研究了一下 BinaryReader (使用方式見下圖
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7hsbwc2twLzHFADY3Ef3k0cVoQMFwVNksW0-p4AQTHr3_UAmYB_8rfRu_NTZIw5XXng_fdr24ZQfoPRddrQFT-Fy7YJvzNPFyBJOC8AW-0yhj0Z-6M4uLc8zDQgNNPo987w4FCuFHkwBa/s400/br0.png)
BinaryReader 直接提供了很多種讀取方式
可以滿足一般人的需求 XD
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM_7ilIMXdZs2Y9PfJXZZWqmIxBVXAaZLCeSFH-P3w_f4Ce30WLaTNtZ9uhRMKe-jACSWhR6vgFNAPSAboWSrRe2wJSFqO6SWhzRbpCQJZnlxhhT8gThgRNrNq63GWaqdMrFFPTgmF753k/s400/br1.png)
不過使用這些函式時要注意一點
它們都是以目前 Stream 讀取到的地方當作起點
讀取完並向前推進
比如說 目前將檔案讀取到了第 24 byte的地方
ReadInt32 函式就會往前讀取 4 bytes
而且目前的 index 會變成 28
不過這種要多少讀多少的方式算是中規中矩
速度不快 但很穩
可是坎尼這次處理的是較大型的檔案
所以坎尼偷吃步的先把所有的資料讀進一個 byte 陣列中
再去對些陣列做存取
這樣做的好處有:很快、可以隨意取出資料
壞處當然就是很耗資源 常常一下子就發生 OutOfMemory 的慘劇
當然 這個 byte 陣列要怎麼轉換成數字及文字呢?
.NET 提供了以下的方法
在 System 這個 Namespace裡 有個 BitConverter 靜態 Class
提供的方法大致上和上面 BinaryReader 的讀取函數差不多
只是需要傳入要轉換的 byte 或 char 陣列 以及 index
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcxOSEQn-33pzk1HXPIAn5Lz6ZOSZ4eyTz5tvBgXaGW1NtVo6GrPdRfwv6uXNSPJaSMU8JUSggIs1uwMgTPOnKIgzL81HlW4OeVPpod2DdHsy2w6TGXj5l_7Q0YVQK4HHYZXvkZK1eZpJm/s400/br2.png)
上面是取得數字 再來是要講如何取得文字
在 System.Text 底下有個 Encoding 的靜態 Class
平常坎尼都用它來轉換編碼 沒想到它竟然內建了 GetString 的方法
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKnuF5QHlcqiLuFdO2iAG2YTgelvE7Ek7r1YE-TJrR-p1hNxXzm5BmppaaXjFnIn9sD3z-nnHLP27zaD1nQuZ_rzEQkK-pSL-KB6e0lktE-U9YAntfF2Dwz1aycH9eWYOlfi1WouGGBbCO/s400/br3.png)
GetString 前面的 Default 就是以當前預設的語言編碼去轉換
這地方可依個人需求改成 utf-8、unicode、ASCII....
GetString 則是要傳入要轉換 byte 陣列
另外還有 index 及 count (另一個多載方法可不傳入
抓圖裡這段 code 就是指
在 b 這個陣列的第5個 byte 開始 抓取 12 個 byte 資料
將它轉換成文字
當然 這地方要確定真的是文字 不然抓出來可能是些奇怪的符號
大致上講到這邊 坎尼對 IO 的研究也沒有很深
家裡那本 IO 存取的書 買到現在才將本機存取的部分看完 orz
還有一半在講網路 IO 的 可能要等哪天興起拿起來翻吧 囧>
另外補充給 Tim
其實這個和 Sql Server 裡存的 Binary 資料存取方式應該不太一樣
Sql Server 那個坎尼也沒研究過 只知道可以把圖片直接轉成 Binary 丟進去存
將它轉換成文字
當然 這地方要確定真的是文字 不然抓出來可能是些奇怪的符號
大致上講到這邊 坎尼對 IO 的研究也沒有很深
家裡那本 IO 存取的書 買到現在才將本機存取的部分看完 orz
還有一半在講網路 IO 的 可能要等哪天興起拿起來翻吧 囧>
另外補充給 Tim
其實這個和 Sql Server 裡存的 Binary 資料存取方式應該不太一樣
Sql Server 那個坎尼也沒研究過 只知道可以把圖片直接轉成 Binary 丟進去存
沒有留言:
張貼留言