2011-03-30 125 views
0

我正在嘗試讀取由舊Fortan應用程序寫入的二進制文件。從32位塊中讀取n位

它將數據寫入32位的塊中。這些32位chnuk中的一些包含多個數據。

例如1: 9位將包含位置偏移值範圍從(0-511) 22位將包含數據記錄值範圍爲(1-2097151)

EG2: 17位將包含年(1-131071) 4位將包含從(1-12) 範圍內的月份值5位將包含範圍從(1-31) 的日期值5位將包含範圍從(1-24)

我想知道如何讀取數據,我可以得到整數的32位值存儲,但是什麼操作應該執行離子來提取4字節值的不同部分。

+1

選中[在C#位域(http://stackoverflow.com/questions/14464/bit-fields-in- c)可能是您的問題的最佳解決方案。 – 2011-03-30 05:03:06

回答

3

一般來說,類似如下(這不一定是有效的C#)應該工作:

int readValue(int sourceBits, int dataOffset, int dataLength) { 
    unsigned int mask = pow(2, dataLength) - 1; 
    return (sourceBits >> dataOffset) & mask; 
} 

注意,數據偏移從該領域的最右邊的位開始治療,其值增長到左邊。要使用從左邊開始偏移和成長的權利,這樣做:

int readValue(int sourceBits, int dataOffset, int dataLength) { 
    unsigned int mask = pow(2, dataLength) - 1; 
    return (sourceBits >> (32 - (dataOffset - dataLength))) & mask; 
} 
+0

+1。更改爲'uint'和'Math.Pow',做一堆轉換(因爲'Math.Pow'只接受並返回'double'),我認爲你有一個贏家。基本上你正在做掩碼和位移,這在C#中完全支持。 – 2011-03-30 06:54:37

+2

轉儲'Math.Pow'。它速度慢,價格昂貴,而且操作錯誤(雙倍)。相反,使用'uint mask =(1 << dataLength) - 1;'。 – 2012-04-01 02:42:45