逐字节需要异或但它显示为整数并丢失精度错误?
Byte by byte need to xor but its showing as integer and getting lost of precision error?
我有套接字应用程序,我可以逐字节读取,我可以将所有字节放入一个数组中。我读起来像 below.So 我将有 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("\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));
xor = (byte) ((byte)xor ^ (byte)fullMessage[sf]);
第一次因为你在做:
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
所以 xorring 将是:
int xor = 0;
for (int sf = 0, s = fullMessage.length; sf < s; sf++) {
xor ^= fullMessage[sf];
fullMessage[sf] = (byte)xor;
}
利用0是^
的中性元素。
我有套接字应用程序,我可以逐字节读取,我可以将所有字节放入一个数组中。我读起来像 below.So 我将有 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("\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));
xor = (byte) ((byte)xor ^ (byte)fullMessage[sf]);
第一次因为你在做:
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
所以 xorring 将是:
int xor = 0;
for (int sf = 0, s = fullMessage.length; sf < s; sf++) {
xor ^= fullMessage[sf];
fullMessage[sf] = (byte)xor;
}
利用0是^
的中性元素。