Чтение n-битов из 32-битного блока - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь прочитать двоичный файл, написанный устаревшим приложением Fortan.

Он записывает данные в 32-битные блоки.Некоторые из этих 32-битных chnuk содержат многократные данные.

например, 1: 9 бит будет содержать значение смещения позиции в диапазоне (0-511), 22 бит будет содержать значение записи данных в диапазоне (1-2097151)

eg2: 17 бит будет содержать значение года в диапазоне (1-131071) 4 бит будет содержать значение месяца в диапазоне (1-12) 5 бит будет содержать дневное значение в диапазоне (1-31) 5 бит будет содержать значение часового диапазонаиз (1-24)

Мне интересно, как читать данные, я могу получить 32-битное хранилище значений в целых числах, но какие операции я должен выполнить, чтобы извлечь различные части этого 4-байтового значения.

1 Ответ

3 голосов
/ 30 марта 2011

Вообще говоря, должно работать что-то вроде следующего (что не обязательно является допустимым C #):

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> dataOffset) & mask;
}

Обратите внимание, что смещение данных обрабатывается как начиная с самого правого бита в поле, причем значения растутналево.Чтобы использовать смещения, которые начинаются слева и растут вправо, сделайте что-то вроде:

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> (32 - (dataOffset - dataLength))) & mask;
}
...