1

我被赋予了以下编程任务(编辑以模糊任务细节):

可以查询原始(二进制)文件(阶段 II 实施所需)以检测 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 个“单词”并根据该格式检测右/左 pod。

这是我编写的一些初步代码,但它不起作用。我知道我正在阅读的文件应该是 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;

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

4

1 回答 1

2

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

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

ushort yourWord = firstByte << 8 | secondByte;
于 2011-03-14T12:15:57.487 回答