如何在java中屏蔽字节以获取条件

时间:2011-11-23 13:03:24

标签: java sockets if-statement byte mask

我从套接字byte[]读取Param_CodeParam_Code的条件如下:

•选项1:有时Param_Code对应于ID

•选项2:有时Param_Code对应于0x40000000 + ID

•选项3:有时Param_Code对应于0x80000000 + ID

这是我的代码:

byte[] cbuf = new byte[4];

socketReader.read(cbuf, 0, 4);

int Param_Code = byteArrayToIntBI(cbuf, 0);

public static int byteArrayToIntBI(byte[] b, int offset) {
    int value = 0;
    for (int i = 3; i > -1; i--) {
        int shift = (i) * 8;
        value += (b[i + offset] & 0x000000FF) << shift;
    }
    return value;
}

我的问题是,当Param_Code是上述选项之一时,我怎么知道(有if语句或其他内容)?

我如何获得身份证?

if( ? ){
        it is Option 1 and ID = ?
}else if( ? ){
        it is Option 1 and ID = ?
}else if( ? ){
        it is Option 1 and ID = ?
}

2 个答案:

答案 0 :(得分:1)

这是标准的bittwiddling

int mask1 = 0x80000000;
int mask2 = 0x40000000;
int id = paramCode & ~(mask1|mask2);// ~ is NOT,  & is AND and | is OR
if((paramCode&mask1) != 0){
   //option 2
}else if((paramCode&mask2) != 0){
   //option 3
}else{
   //option 1
}
如果你没有遇到严重的问题,

我的假设ID将适合0x3fffffff

答案 1 :(得分:0)

您应该在ID上添加一些限制。因为在那种情况下我们不能应用蒙版。

想象一下,你得到了0x81234123。它可以是:

  • ID 0x81234123
  • ID 0x41234123
  • ID 0x01234123

提供额外条件以避免这种歧义。 我只能假设您的ID不包含第一个十六进制数字,因此,在这种情况下使用掩码:ID = NUM & 0x0FFFFFFF

NUM实际上就是你的字节[4]