2008年9月17日

Binary Stream 讀取一些小心得

最近處理一個轉檔的程序
剛好要碰到比較基層的位元讀取
所以坎尼把一點點小小心得給寫出來

首先,要講的是 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 丟進去存

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D