使用位掩码检查二进制文件的信息

时间:2011-03-14 12:05:19

标签: c# binary bitmask

我接受了以下编程任务(编辑以模糊任务细节):

  

可以查询原始(二进制)文件(第二阶段实施所需)以检测是否存在pod。格式取决于文件的来源 - FormatX与FormatY。使用16位的字大小,可以使用以下位掩码来确定文件中存在的pod:

Word #  Mask    Value   Indicates
1       0xFF00  0x8700  Little Endian (Format X)
1       0x00FF  0x0087  Big Endian (Format Y)
13      0x0200  0x0200  right pod installed (Format X)
13      0x0002  0x0002  right pod installed (Format Y)
13      0x0100  0x0100  left pod installed (Format X)
13      0x0001  0x0001  left pod installed (Format Y)

到目前为止我是如何解决这个问题的:我在本地文件系统上有文件,因此我使用System.IO.File.OpenRead将其转换为Stream对象。我想一次读取16位/ 2字节的流。对于这个大小的第一个“单词”,我尝试应用位掩码来检测我正在处理的格式。然后我跳到第13个“单词”并根据该格式检测右/左豆荚。

以下是我编写的一些初步代码无效。我知道我正在阅读的文件应该是格式Y,但我的检查不起作用。

int chunksRead = 0;
int readByte;
while ((readByte = stream.ReadByte()) >= 0)
{
    chunksRead++;

    if (chunksRead == 1)
    {
        // Get format
        bool isFormatY = (readByte & 0x00FF) == 0x0087;
    }
    else if (chunksRead == 13)
    {
        // Check pods
    }
    else if (chunksRead > 13)
    {
        break;
    }
}

任何人都可以看到我的实施有什么问题吗?我应该如何解释2字节的单词大小?

根据@Daniel Hilgarth的回复编辑 感谢Daniel的快速回复。我做了一个改变,它正在为第一个词起作用,现在:

byte[] rawBytes = new byte[stream.Length];
stream.Read(rawBytes, 0, rawBytes.Length);
ushort formatWord = Convert.ToUInt16(rawBytes[0] << 8 | rawBytes[1]);
bool formatCheck = (formatWord & 0x00FF) == 0x0087;

我只需找到一个示例文件,该文件应该为安装的右/左窗格返回肯定结果以完成此任务。

1 个答案:

答案 0 :(得分:2)

您正在混合字节和单词。位置13处的是关于是安装左侧还是右侧吊舱。您正在读取12个字节以到达该位置,并且您正在检查第13个字节。那只是中途 格式检查也是同样的问题。您应该阅读第一个(= 2个字节)并检查它是否是所需的值之一。

要从您读取的两个字节中获取单词,您可以使用位移运算符&lt;&lt;

ushort yourWord = firstByte << 8 | secondByte;