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

如何在java中屏蔽字节以获取条件,java,sockets,if-statement,byte,mask,Java,Sockets,If Statement,Byte,Mask,我从套接字读取byte[]作为Param\u code。Param_code的条件如下: •选项1:有时参数代码对应于ID •选项2:有时,参数代码对应于0x40000000+ID •选项3:有时,参数代码对应于0x8000000+ID 这是我的代码: byte[] cbuf = new byte[4]; socketReader.read(cbuf, 0, 4); int Param_Code = byteArrayToIntBI(cbuf, 0); public static int

我从套接字读取
byte[]
作为
Param\u code
Param_code
的条件如下:

•选项1:有时
参数代码
对应于ID

•选项2:有时,
参数代码
对应于0x40000000+ID

•选项3:有时,
参数代码
对应于0x8000000+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;
}

您应该在ID上添加一些限制。因为在这种情况下我们无法应用掩码

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

  • ID 0x81234123
  • ID 0x41234123
  • ID 0x01234123
提供附加条件以避免这种歧义。 我只能假设您的ID不包括第一个十六进制数,因此在这种情况下,请使用掩码:
ID=NUM&0x0FFFFFFF


NUM实际上是您的字节[4]

这是标准的位旋转

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
}

im assumming ID将适用于
0x3fffffff
如果您有严重问题

我在if语句中得到此错误:运算符“&”不能应用于“int”,布尔值@michdraft添加了参数以修复优先级问题SPARAM_代码是我从套接字中得到的。有时参数代码仅包括ID,有时包括(0x40000000+ID),有时包括(0x8000000+ID)。您能提供一个if语句让我更清楚吗?code=code&0x0FFFFFFF不带ifs。但只有当您的id限制在0x0FFFFFI REQUIRE IF语句的范围内时,才需要知道参数代码中何时包含此条件之一。因为每一种情况都应该以不同的方式处理。
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
}