Чтение байта и маски его в Java - PullRequest
0 голосов
/ 23 ноября 2011

Я должен получить ID из сокета, но этот код не дает правильный. Может кто-нибудь сказать мне, что не так в моем коде? (см. ниже для получения дополнительной информации)

for (int i = 0; i < numberOfSRecords; i++) {
    socketReader.read(cbuf, 0, 4);
    String Param_Codes_In_HEX =
        Integer.toHexString(0x000000ff & cbuf[2]) +
        Integer.toHexString(0x000000ff & cbuf[1]) +
        Integer.toHexString(0x000000ff & cbuf[0]);
    System.out.println("Param_Codes_In_HEX: "+Param_Codes_In_HEX);
    int paramCode = Integer.parseInt(Param_Codes_In_HEX, 16);
    if ((0x000000ff & cbuf[3]) ==0) {
    EnumParamCodes enumParamCode = 
         EnumConverterUtil.getEnumFor(EnumParamCodes.class, paramCode);
    System.out.println("Param_code " + paramCode + ": " + enumParamCode);
    }
  else if((0x000000ff & cbuf[3]) ==64)
   {
    paramCode = 0x0000ffff & paramCode ;
    EnumParamCodes enumParamCode = EnumConverterUtil.getEnumFor(EnumParamCodes.class, paramCode);
   System.out.println("Param_code " + paramCode + ": " + enumParamCode);
   }
  else if ((0x000000ff & cbuf[3]) ==128) {
      paramCode = 0x00ffffff & paramCode ;
      EnumAlarm enumParamCodeAlarm = EnumConverterUtil.getEnumFor(EnumAlarm.class, paramCode);
      System.out.println("Param_code " + paramCode + ": " + enumParamCodeAlarm);
    } 
  else{
      System.out.println("Error in the body of message");
        }
      }

Примечание: • Для числовых и перечислительных параметров (ActualValue) Param_code соответствует идентификатору в разделе Parameters

• Для числовых и перечислительных параметров (SetValue) Param_code соответствует 0x40000000 + идентификатор в параметрах раздел

• Для параметров тревоги, Param_code соответствует 0x80000000 + идентификатор в разделе параметров

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011
String getByteString(byte b) {
    StringBuffer buf = new StringBuffer();
    String digit=Integer.toHexString(b &0xff);
    buf.append(digit);
    if (digit.length()<2) buf.append('0');
    return buf.toString();
}

это должно получить 0 дополнений для вас

String Param_Codes_In_HEX = getByteString(cbuf[2]) + getByteString(cbuf[1]) + getByteString(cbuf[0]);
0 голосов
/ 23 ноября 2011

Код довольно сложный для того, что он делает ИМХО.Вероятно, одной из проблем является конкатенация строк, когда вы хотите выполнять битовые манипуляции.например, байты 1,2,3 станут 123 вместо 010203

...