Изучение двоичного файла для информации с использованием битовых масок - PullRequest
1 голос
/ 14 марта 2011

Мне было дано следующее задание на программирование (отредактировано, чтобы скрыть специфику миссии):

Необработанный (двоичный) файл (необходимый для реализации этапа 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;

Мне просто нужно найти файл примера, который должен вернуть положительный результат для правого / левого модуля, установленного для выполнения этой задачи.

1 Ответ

2 голосов
/ 14 марта 2011

Вы смешиваете байты и слова.Слово в позиции 13 означает, установлен ли левый или правый модуль.Вы читаете 12 байт , чтобы добраться до этой позиции, и вы проверяете 13-й байт .Это только наполовину.
Та же проблема с проверкой формата.Вы должны прочитать первое слово (= 2 байта) и проверить, является ли оно одним из желаемых значений.

Чтобы получить слово из двух прочитанных вами байтов, вы можете использовать битовое смещениеоператор << </strong>:

ushort yourWord = firstByte << 8 | secondByte;
...