从32位块中读取n位

问题描述:

我正在尝试读取由旧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://*.com/questions/14464/bit-fields-in- c)可能是您的问题的最佳解决方案。 – 2011-03-30 05:03:06

一般来说,类似如下(这不一定是有效的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 2012-04-01 02:42:45