2013-10-25 1 views
0

Мой вопрос заключается в основном о том, как интерпретировать ЬурейеЕ перечисление, но вот фон:Как Интерпретировать ЬурейеЕ перечислимую собственности на MCOIMAPMessage

Я использую MailCore2, и я пытаюсь выяснить, как читать флаги от отдельного объекта электронной почты, который я получаю.

Каждое электронное письмо MCOIMAPMessage *, которое я получаю, имеет свойство на нем, называемое флажками. Флаги имеют тип MCOMessageFlag. Когда я смотрю на определение MCOMessageFlag, я считаю, что это ЬурейеЕ перечисление:

typedef enum { 
    MCOMessageFlagNone   = 0, 
    /** Seen/Read flag.*/ 
    MCOMessageFlagSeen   = 1 << 0, 
    /** Replied/Answered flag.*/ 
    MCOMessageFlagAnswered  = 1 << 1, 
    /** Flagged/Starred flag.*/ 
    MCOMessageFlagFlagged  = 1 << 2, 
    /** Deleted flag.*/ 
    MCOMessageFlagDeleted  = 1 << 3, 
    /** Draft flag.*/ 
    MCOMessageFlagDraft   = 1 << 4, 
    /** $MDNSent flag.*/ 
    MCOMessageFlagMDNSent  = 1 << 5, 
    /** $Forwarded flag.*/ 
    MCOMessageFlagForwarded  = 1 << 6, 
    /** $SubmitPending flag.*/ 
    MCOMessageFlagSubmitPending = 1 << 7, 
    /** $Submitted flag.*/ 
    MCOMessageFlagSubmitted  = 1 << 8, 
} MCOMessageFlag; 

Поскольку я не знаю, как ЬурейеЕ перечислений действительно работает - особенно это один с «= 1 < < 8» компонентов типа , Я немного потерял о том, как читать свойства флагов электронной почты.

Например, у меня есть сообщение электронной почты, на котором есть как MCOMessageFlagSeen, так и MCOMessageFlagFlagged на сервере. Я хотел бы узнать из свойства email.flags, имеет ли одно из них получаемое письмо, оба или ни один из этих флагов (если это возможно). Тем не менее, в отладчике, когда я печатаю «email.flags» для письма с двумя указанными выше флагами, я возвращаю только номер 5. Я не вижу, как это относится к определениям перечисления typedef выше.

В конечном счете, я хочу установить значение BOOL в зависимости от наличия или отсутствия флага. Другими словами, я хотел бы сделать что-то вроде:

BOOL wasSeen = email.flags == MCOMessageFlagSeen; 
BOOL isFlagged = email.flags == MCOMessageFlagFlagged; 

Конечно, это не сработает, но это идея. Может ли кто-нибудь предложить, как я могу это сделать и/или как понять перечисление typedef?

ответ

3

Эти флаги используются как в bitmask.

Это позволяет хранить несколько флагов включения/выключения в одном цифровом виде (пусть это будет unsigned char или unsigned int). В принципе, если установлен флаг, устанавливается соответствующий бит.

Например:

MCOMessageFlagMDNSent  = 1 << 5 

1<<5 означает 1 смещается влево на 5 битов, так что в двоичной системе:

00000001 << 5 = 00100000 

Это работает только тогда, когда ни один флаг не пересекается с другими флагами, который, как правило, достигнув начального значения с 1 и сдвигая его налево на другую величину для каждого флага.

Затем, чтобы проверить, если установлен флаг вам проверить, если соответствующий бит установлен, например:

if (flags & MCOMessageFlagMDNSent) 

результат будет true если побитовое И результат отличен от нуля, то это может произойти только в случае, если соответствующий бит установлен.

Вы можете установить флаг легко с OR:

flags |= MCOMessageFlagMDNSent; 

или сбросить его с AND:

flags &= ~MCOMessageFlagMDNSent; 
+0

Спасибо, что было очень полезно. – jac300

0

Значения enum представляют отдельные биты, так что вам нужно битовые операции для проверки флагов:

BOOL wasSeen = (email.flags & MCOMessageFlagSeen); // check if a bit was set 

BTW: Вы код, кажется, предполагает это C, а не C++. Пометка вопроса - это почти всегда неправильно, я предлагаю вам выбрать язык, который вы используете, и удалить другой тег.

Смежные вопросы