2011-03-14 153 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