字节需要xor但是它显示为整数并且丢失了精度错误?

时间:2016-09-28 07:38:26

标签: java arrays bytebuffer

我有套接字应用程序,我可以逐字节读取,我可以将所有字节推送到一个单独的数组。我读得如下。所以我将有12 + bodylen字节。

int messageID = r.readUnsignedShort();
int bodyLen = r.readUnsignedShort();       
byte[] phoneNum = new byte[6];
r.readFully(phoneNum);  
int serialNum = r.readUnsignedShort();     
byte[] messageBody = new byte[bodyLen];    
r.readFully(messageBody);
byte checkCode = r.readByte();

接下来我这样做我创建一个bytebuffer然后我尝试运行for循环首先打印以检查其字节格式在哪里我以整数值接收它导致其中一个值为-110?并且我在这一行收到错误xor =(byte)xor ^(byte)fullMessage [sf];可能会失去精确度?

ByteBuffer buf = ByteBuffer.allocate(12+bodyLen);
          buf.putShort((short)messageID);
          buf.put((byte)bodyLen);
          buf.put(phoneNum);
          buf.putShort((short)serialNum);
          buf.put(messageBody);

          byte[] fullMessage=buf.array();

          int xor = 0;
          for(int sf=0,s=fullMessage.length;sf<s;sf++){
              xor ^= fullMessage[sf];
              fullMessage[sf] = (byte)xor;
             // System.out.println("\n\nprint value for : "+sf+"  "+"value is:"+xor);
                 // do your XOR operations -> xor operator is ^
          }
          System.out.println("\n\nfinal xor is :"+xor+"  "+Integer.toHexString(xor));

2 个答案:

答案 0 :(得分:1)

xor = (byte) ((byte)xor ^ (byte)fullMessage[sf]);

答案 1 :(得分:1)

首先,因为你在做:

int serialNum = r.readUnsignedShort();     

替换

buf.put((byte)serialNum);

通过

buf.putShort((short)serialNum);

符号会使值偏斜,但可以通过以下方式修改:& 0xFFFF

字节被xorred为:

byte x = (byte) 0xA0; // Negative signed byte value
byte y = ...
byte z = (byte)(x ^ y); // Xor is done on int

所以xorring将是:

    int xor = 0;
    for (int sf = 0, s = fullMessage.length; sf < s; sf++) {
        xor ^= fullMessage[sf];
        fullMessage[sf] = (byte)xor;
    }

使用该0是^的中性元素。