【问题标题】:Android: Need help understanding &0x04 behind a variable assignmentAndroid:需要帮助理解变量赋值背后的 &0x04
【发布时间】:2011-08-09 21:51:31
【问题描述】:

想知道是否有人可能有一些见解或将我指向解释以下代码行的正确文档:

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!感谢您的所有帮助。

这是用于使用 eclipse 和 java 的 Android sdk。此外,该代码是另一个 sdk 的一部分,该 sdk 是磁卡读卡器的一部分,该读卡器通过音频端口连接到 Android 供电的设备。该产品称为 unimag pro。这是网站:http://www.idtechproducts.com/products/mobile-readers/126.html 我确实向他们发送了同样的问题,但谁知道他们是否以及何时会回复。对于可能遇到相同问题的其他人,我也会在这里发布他们的答案。

如果您需要更多信息,请告诉我。

谢谢。

【问题讨论】:

  • 好吧,亲爱的!感谢大家的惊人解释。我以前从未处理过按位与。他们可以这样写吗:'flagOfCardData & 0x04' 带有空格以使其更具可读性?

标签: java android hex


【解决方案1】:

您的flagOfCardData 是一个 8 位整数,但每个位都被单独分配了一些独立的含义。在您的情况下,您 only 想知道它的 second 位。为此,您使用 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

现在X1,如果第二个位被设置(1 &amp; 1 = 1),0 否则(1 &amp; 0 = 0)。因此flagOfCardData &amp; 0x04 相应地是 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

【讨论】:

    【解决方案2】:

    读作:

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

    &amp; 是“位与”运算符。 0x04 是二进制 00000100 的十六进制值。并且该位模式将挑选出flagOfCardData 变量的单个位,我假设它是一组标志。

    如果设置了标志,那么flag == 0x04。如果未设置则flag == 0x00。在下面的if 语句中检查了这两种可能性。从评论看,这是“加密数据”标志。

    【讨论】:

      【解决方案3】:

      代码测试 flagOfCardData 的第 2 位是否设置。值 0x4 是二进制 00000100。“&”运算符执行按位与运算,这意味着将两个操作数字节的每个位与运算一起产生一个字节大小的结果(与逻辑与相反)。

      根据 cmets,如果 flag 不为零,即设置了第 2 位,该函数应该解密数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-09
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多