2011-03-14 155 views
1

我一直在考虑下面的编程任务检查二进制文件的信息(编辑晦涩任务细节):使用位掩码

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

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的回复编辑
感谢您的快速回复,丹尼尔。我做了一个变化,它的工作的第一句话,就是现在:

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; 

我只需要找到一个示例文件,它应该返回阳性结果的安装来完成这个任务左/右吊舱。

回答

2

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

要想从两个字节,你读一个字,你可以使用移位操作< <

ushort yourWord = firstByte << 8 | secondByte; 
+0

因此,基于这样的认识,在13字将是第25届的组合和我的流中第26个索引字节,对吗?请参阅我的原始文章的更新。我能够根据你的帮助来检测格式。谢谢。 – Hillarie 2011-03-14 12:43:45

+0

@Hillarie:不客气。正确的索引是24和25。 – 2011-03-14 13:01:31