Java 逐字节需要进行异或运算,但它显示为整数并丢失精度错误?

Java 逐字节需要进行异或运算,但它显示为整数并丢失精度错误?,java,arrays,bytebuffer,Java,Arrays,Bytebuffer,我有一个socket应用程序,我可以一个字节一个字节地读取数据,我可以把所有的字节放到一个数组中。我的阅读如下。所以我将有12个以上的bodylen字节 int messageID = r.readUnsignedShort(); int bodyLen = r.readUnsignedShort(); byte[] phoneNum = new byte[6]; r.readFully(phoneNum); int serialNum = r.readUnsignedShor

我有一个socket应用程序,我可以一个字节一个字节地读取数据,我可以把所有的字节放到一个数组中。我的阅读如下。所以我将有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=(字节)xor^(字节)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));
ByteBuffer buf=ByteBuffer.allocate(12+bodyLen);
buf.putShort((short)messageID);
buf.put((字节)bodyLen);
buf.put(phoneNum);
buf.putShort((short)serialNum);
buf.put(消息体);
字节[]fullMessage=buf.array();
int-xor=0;
for(int-sf=0,s=fullMessage.length;sf-xor运算符为^
}
System.out.println(“\n\n最终xor为:“+xor+”+Integer.toHexString(xor));

xor=(byte)(byte)xor^(byte)fullMessage[sf]);
xor=(byte)(byte)xor^(byte)fullMessage[sf]);
首先,因为您正在执行以下操作:

int serialNum = r.readUnsignedShort();     
替换

buf.put((byte)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;
    }
intxor=0;
for(int-sf=0,s=fullMessage.length;sf

首先使用0作为
^

的中性元素,因为您正在执行以下操作:

int serialNum = r.readUnsignedShort();     
替换

buf.put((byte)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;
    }
intxor=0;
for(int-sf=0,s=fullMessage.length;sf

使用0是
^

的中性元素,这是相同的原则。当然,当它无意缩短消息字节时,可以省略一些。我已经更新了我的问题,但是我得到了错误的xor值,假设它只是一个bye?我将其保留为buf.put(phoneNum)?可以吗?我一直在为相同的输入数据获取不同的xor值?很抱歉响应太晚。xorring从小索引向上传播。我不知道要求,所以让人费解的是你。
put(byte[])
似乎可以。在字节缓冲区上执行
buf.order(ByteOrder.LITTLE\ENDIAN)
可能会出现一个相反的简短顺序。但是,如果阅读时长度也相距很远,你会看到。同样的原则。当然,当它无意缩短消息字节时,可以省略一些。我更新了我的问题,但我得到了错误的xor值。假设它只是一个bye?我把它作为buf.put(phoneNum);?这样好吗?我一直在为相同的输入数据获取不同的异或值?很抱歉,响应太晚。异或从小索引向上传播。我不知道要求,所以让人费解的乐趣在于你。
put(byte[])
似乎很好。在字节缓冲区上执行
buf.order(ByteOrder.LITTLE\ENDIAN)
也许短裤的顺序是相反的。但如果长度与阅读时的距离太远,你就会看到。