Как замаскировать байт в Java, чтобы получить условие - PullRequest
0 голосов
/ 23 ноября 2011

Я прочитал byte[] из сокета как Param_Code. есть условие для Param_Code, как показано ниже:

• Вариант 1: иногда Param_Code соответствует идентификатору

• Вариант 2: иногда Param_Code соответствует 0x40000000 + идентификатор

• Вариант 3: иногда Param_Code соответствует 0x80000000 + идентификатор

Это мой код:

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;
}

Мой вопрос: как я могу узнать (с помощью оператора if или что-то еще), когда Param_Code является одним из указанных выше вариантов?

Как я могу получить ID?

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

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

это стандартная битва

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, если нет серьезных проблем

0 голосов
/ 23 ноября 2011

Вы должны добавить некоторые ограничения на ID. Потому что мы не можем применить маску в этом случае.

Представь, что ты получил 0x81234123. Это может быть:

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

Укажите дополнительное условие, чтобы избежать этой двусмысленности. я могу только предположить, что ваш идентификатор не содержит первого шестнадцатеричного числа, поэтому в этом случае используйте маску: ID = NUM & 0x0FFFFFFF

NUM на самом деле ваш байт [4]

...