一个字节一个字节需要异或,但它显示为整数,失去了精度误差



我有套接字应用程序,我可以一个字节一个字节地读取,我可以把所有字节推入一个数组。我读到如下。所以我将有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();

接下来我这样做,我创建了一个字节缓冲区,后来我试图运行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("nnprint value for : "+sf+"  "+"value is:"+xor);
                 // do your XOR operations -> xor operator is ^
          }
          System.out.println("nnfinal xor is :"+xor+"  "+Integer.toHexString(xor));

既然你在做:

int serialNum = r.readUnsignedShort();     
代替

buf.put((byte)serialNum);

buf.putShort((short)serialNum);

符号使值倾斜,但可以通过以下方法修复:& 0xFFFF .

字节被格式化为:

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

所以格式是:

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

使用0是^的中性元素

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

相关内容

最新更新