Android:需要帮助理解变量赋值背后的0x04



想知道是否有人可能有一些见解或指出适当的文档来解释下面的代码行:

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

我没有任何线索,为什么有&0x04 flagOfCardData之后。我知道它和十六进制有关,但就是这样。这里是函数中的代码行。

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的一部分,该sdk是通过音频端口连接到Android供电设备的磁卡读卡器的一部分。该产品名为unimagpro。网址是:http://www.idtechproducts.com/products/mobile-readers/126.html我确实给他们发了同样的问题,但谁知道他们是否会回应,什么时候会回应。我将把他们的答案贴在这里,也给其他可能遇到同样问题的人。

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

谢谢。

您的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

如果第二个位设置为1 & 1 = 1,则X1,否则为0 (1 & 0 = 0)。因此,flagOfCardData & 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

将此阅读为:

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

&是"位与"操作符。0x04是二进制00000100的十六进制。使用该位模式将挑选出flagOfCardData变量的单个位,我假设它是一组标志。

如果设置了标志,则flag == 0x04。如果没有设置,则为flag == 0x00。下面的if语句检查了这两种可能性。从注释的外观来看,这是"加密数据"标志。

代码测试是否设置了flagOfCardData的第2位。0x4是二进制00000100。'&'运算符执行位与运算,即将两个操作数字节的每一位进行与运算,以产生一个字节大小的结果(与逻辑与运算相反)。

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

最新更新