从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字节值的不同部分。
一般来说,类似如下(这不一定是有效的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;
}
+1。更改为'uint'和'Math.Pow',做一堆转换(因为'Math.Pow'只接受并返回'double'),我认为你有一个赢家。基本上你正在做掩码和位移,这在C#中完全支持。 – 2011-03-30 06:54:37
转储'Math.Pow'。它速度慢,价格昂贵,而且操作错误(双倍)。相反,使用'uint mask =(1 2012-04-01 02:42:45
选中[在C#位域(http://*.com/questions/14464/bit-fields-in- c)可能是您的问题的最佳解决方案。 – 2011-03-30 05:03:06