Как мне интерпретировать # if / # else битовое поле? (VC ++ нуб) - PullRequest
0 голосов
/ 09 сентября 2018

Справочная информация: У меня есть глючная программа, которая декомпилирует определенный набор файлов. Ошибки НЕ связаны с записями, которые он декомпилирует, просто некоторые вспомогательные вещи. Я портирую программу на AHK, чтобы убрать ошибки и добавить некоторые функции.

Проблема: Каждый конкретный файл, который он декомпилирует, ссылается на структуру отображения для каждой записи в этом файле. Большинство из них легко определить. Я столкнулся с выражением битового поля в одном из них, и я немного запутался в том, как его прочитать:

#if 1
    unsigned char vCombinedBits1;
    unsigned char vCombinedBits2;
#else
    unsigned char iPadding1_1 : 3;
    unsigned char vdirect : 1;

    unsigned char vitemspecific : 1;
    unsigned char vdamagerelated : 1;
    unsigned char vSigned : 1;
    unsigned char vSendmyspOther : 1;

    unsigned char iPading1 : 1;
    unsigned char iPading1_1 : 1;
    unsigned char vCSvSigned : 1;
    unsigned char vSaved : 1;

    unsigned char vfCallback : 1;
    unsigned char vfMin : 1;
    unsigned char vUpdateAnimRate : 1;
    unsigned char iPadding1_2 : 1;
#endif

Я не новичок в логике If / Else, но я am незнакомец для Visual C ++.

Мой предполагаемый конечный результат этого, основанный на this и , что : по сути, я просто прочитаю оба байта независимо от значения vCombinedBits1 и сопоставлю каждый бит переменной Я нуждаюсь.

Правильно ли я предположил, что образец 0x01 0x14 (0000 0001 0001 0100) будет отображаться так: iPadding1_1 = 0 iPadding1_1 = 0 iPadding1_1 = 0 vdirect = 0

vitemspecific = 0 vdamagerelated =0 vSigned =0 vSendmyspOther = 1

iPading1 = 0 iPading1_1 = 0 vCSvSigned = 0 vSaved = 1

vfCallback = 0 vfMin = 1 vUpdateAnimRate =0 iPadding1_2 =0

Найдена вся структура здесь , #if начинается со строки 649

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

По сути, я просто прочитаю оба байта независимо от значения vCombinedBits1 и сопоставлю каждый бит с нужной мне переменной.

OK.

Правильно ли я предположил, что образец 0x01 0x14 (0000 0001 0001 0100) будет отображаться так: ...

Не совсем. Порядок битов в битовых полях зависит от конкретного компилятора (TL; DR), и вы принимаете порядок с прямым порядком байтов. Но в случае компилятора VC ++ он имеет младший порядок. Чтобы сказать, правильно ли ваше предположение, нам нужно увидеть образец фактических данных с декодированием в биты. Если вы хотите, чтобы этот код переносился на любой (неизвестный) компилятор и архитектуру, не используйте битовые поля для декодирования внешних данных.

Аминь! * * 1013

0 голосов
/ 10 сентября 2018

#if 1 означает «включать все, что следует, до #else»; две строки, которые следуют за ним, являются частью кода. Поскольку условие #if истинно, #else означает «игнорировать все, что следует, вплоть до #end; остальные строки не являются частью кода. Это как если бы этот код был написан

unsigned char vCombinedBits1;
unsigned char vCombinedBits2;
...