剛好要碰到比較基層的位元讀取
所以坎尼把一點點小小心得給寫出來
首先,要講的是 Stream 類別
Stream 在 .NET 2.0 裡又分為很多種
有 FileStream、MemoryStream、BufferStream...
但一般常用的應該是 FileStream 類 用來將檔案內容讀出
再來就是存取資料的容器 (直接用 FileStream 也有 Read 函式)
不過這次由於處理的資料需要將位元抓取出來 並換轉成數字或文字
所以坎尼研究了一下 BinaryReader (使用方式見下圖
BinaryReader 直接提供了很多種讀取方式
可以滿足一般人的需求 XD
不過使用這些函式時要注意一點
它們都是以目前 Stream 讀取到的地方當作起點
讀取完並向前推進
比如說 目前將檔案讀取到了第 24 byte的地方
ReadInt32 函式就會往前讀取 4 bytes
而且目前的 index 會變成 28
不過這種要多少讀多少的方式算是中規中矩
速度不快 但很穩
可是坎尼這次處理的是較大型的檔案
所以坎尼偷吃步的先把所有的資料讀進一個 byte 陣列中
再去對些陣列做存取
這樣做的好處有:很快、可以隨意取出資料
壞處當然就是很耗資源 常常一下子就發生 OutOfMemory 的慘劇
當然 這個 byte 陣列要怎麼轉換成數字及文字呢?
.NET 提供了以下的方法
在 System 這個 Namespace裡 有個 BitConverter 靜態 Class
提供的方法大致上和上面 BinaryReader 的讀取函數差不多
只是需要傳入要轉換的 byte 或 char 陣列 以及 index
上面是取得數字 再來是要講如何取得文字
在 System.Text 底下有個 Encoding 的靜態 Class
平常坎尼都用它來轉換編碼 沒想到它竟然內建了 GetString 的方法
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 丟進去存
沒有留言:
張貼留言