读取字节并在java中屏蔽它

时间:2011-11-23 08:53:17

标签: java sockets byte mask

我应该从socket获取ID但是这段代码没有给出正确的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对应于参数部分中的ID

•对于数值和枚举参数(SetValue), Param_code对应于0x40000000 +参数中的ID 节

•对于报警参数,Param_code对应于0x80000000 +参数部分中的ID

2 个答案:

答案 0 :(得分:0)

代码相当复杂,它正在做恕我直言。当你想要进行位操作时,其中一个问题可能是String连接。例如字节1,2,3将变为123而不是010203

答案 1 :(得分:0)

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]);