异或校验和MD5加密有些类似,个人理解的核心原理如下:
假如你需要传输一组数据1,2,3,为了确保数据正确性,你额外加了一个数 6;
最终传输的数据是1,2,3,6 ,这个6是怎么得出的呢? 是前面三个数相加得出;
当接收方收到数据后,尝试判断前三个数加起来是否等于第四个数,等于则证明数据是正确无误的.
下面的异或校验有些类似于深海举的这个例子,只不过区别是:
例子中校验位是用加法得出, 异或校验中的校验位是用异或得出;
发送方加校验位:
将 thisData 前三个数据 异或后得出校验位,并放在这三个数据后
byte[] thisData = new byte[4];
thisData[0] = (byte) 0x00;
thisData[1] = (byte) 0x01;
thisData[2] = (byte) 0x02;
thisData[3] = (byte) (thisData[0] ^ thisData[1] ^ thisData[2]);//校验位
接收方验证校验位:
第一个参数传入校验位曾经校验过的数据;
第二个参数传入校验位
当异或结果等于0 表示校验成功
//开始校验
if (!isVerifyYes(new byte[]{data[0], data[1], data[2]}, data[3])){
// 校验不通过
}
/**
*Author:XingHai.Zhao
*Purpose: 分包数据校验位是否通过验证
* @return
*/
private boolean isVerifyYes(byte[] bytes, byte verify){
for(int i=0; i<bytes.length;i++){
verify = (byte) (verify^bytes[i]);
}
return verify==0;
}