Мне было дано следующее задание на программирование (отредактировано, чтобы скрыть специфику миссии):
Необработанный (двоичный) файл (необходимый для реализации этапа II) может быть запрошен, чтобы определить, присутствуют ли модули. Формат зависит от источника файла - 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;
Мне просто нужно найти файл примера, который должен вернуть положительный результат для правого / левого модуля, установленного для выполнения этой задачи.