Android: нужна помощь в понимании и 0x04 за присвоением переменной - PullRequest
0 голосов
/ 10 августа 2011

задаюсь вопросом, может ли кто-нибудь понять что-то или указать мне соответствующую документацию, объясняющую следующую строку кода:

byte flag = (byte) (flagOfCardData&0x04);

Понятия не имею, почему после flagOfCardData есть & 0x04 . Я знаю, что это связано с чем-то шестнадцатеричным, но это так. Вот строка кода, как в функции.

public void onReceiveMsgCardData(byte flagOfCardData,byte[] cardData) {
        // TODO Auto-generated method stub
        byte flag = (byte) (flagOfCardData&0x04);

        if(flag==0x00)
            _strMSRData = new String (cardData);
        if(flag==0x04)
        {
            //You need to dencrypt the data here first.
            _strMSRData = new String (cardData);
        }
        _MSRData = null;
        _MSRData = new byte[cardData.length];
        System.arraycopy(cardData, 0, _MSRData, 0, cardData.length);
        _isCardData = true;
        handler.post(doHideTopDlg);
        handler.post(doHideSwipeTopDlg);
        handler.post(doUpdateTVS);
    }

Я бы посмотрел, зачем это делать, но я не могу даже найти правильные ключевые слова для поиска DOH! Спасибо за любую помощь.

Это для Android SDK с использованием Eclipse и Java. Кроме того, код является частью другого SDK, который является частью устройства чтения магнитных карт, которое подключается к устройству на платформе Android через аудиопорт. Продукт называется Unimag Pro. Вот сайт: http://www.idtechproducts.com/products/mobile-readers/126.html Я отправил им тот же вопрос, но кто знает, могут ли они ответить и когда. Я также опубликую их ответ здесь для всех, кто может столкнуться с той же проблемой.

Дайте мне знать, если вам нужна дополнительная информация.

Спасибо.

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Прочитайте это как:

byte flag = (byte) (flagOfCardData & 0x04);

& - это оператор "побитовый и". 0x04 является шестнадцатеричным для двоичного 00000100. И этот битовый шаблон выберет один бит переменной flagOfCardData, который, как я предполагаю, представляет собой набор флагов.

Если флаг установлен, то flag == 0x04. Если он не установлен, то flag == 0x00. Эти две возможности проверяются в инструкциях if ниже. Судя по комментарию, это флаг «зашифрованные данные».

1 голос
/ 10 августа 2011

Код проверяет, установлен ли бит 2 flagOfCardData.Значение 0x4 является двоичным 00000100. Оператор «&» выполняет побитовое И, что означает И - объединение каждого из битов двух байтов операнда вместе для получения результата размером в байт (в отличие от логического И).

Согласно комментариям, функция должна расшифровывать данные, если флаг не равен нулю, т.е. был установлен бит 2.

1 голос
/ 10 августа 2011

Ваш flagOfCardData является 8-битным целым числом, но каждому биту в отдельности присваивается какое-то независимое значение.В вашем случае вы только хотите знать его второй бит.Для этого вы выполняете битовые операции - и с 00000100b, что равно 4:

Mystery byte:  ? ? ? ? ? ? ? ? 
We want bit 2: 0 0 0 0 0 1 0 0
               -----------------< bitwise AND
Result         0 0 0 0 0 X 0 0

Теперь X равно 1, если установлен второй бит (1 & 1 = 1), и 0 в противном случае(1 & 0 = 0).Таким образом, flagOfCardData & 0x04 означает eiter 4 или 0.

Обычно используется только шестнадцатеричное обозначение для отдельных битов:

Bit 0: 0x01   Bit 4: 0x10
Bit 1: 0x02   Bit 5: 0x20
Bit 2: 0x04   Bit 6: 0x40
Bit 3: 0x08   Bit 7: 0x80
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...