异或是计算两组相同长度数据的,现在我们测试一下对于不用长度数据的处理结果。
首先来看oracle,RAWTOHEX()用于显示16进制数据,为了严禁这里加上了,不加上也可以正常显示。
SELECT RAWTOHEX(UTL_RAW.BIT_XOR('102030', '405060')) FROM dual;
SELECT RAWTOHEX(UTL_RAW.BIT_XOR('2030', '405060')) FROM dual;
SELECT RAWTOHEX(UTL_RAW.BIT_XOR('102030', '5060')) FROM dual;
结果分别为
507050
606060
404030
可以发现这组数据的结果都是与最长的数据长度是一致的。
根据结果,推测第二个将2030补全为203000,推测第三个将5060补全为506000。可见oracle是将位数少的用00低位填充补全。
接下来看看windows带的计算器,再程序员模式进行计算。
507050
407050
107050
推测第二个将2030补全为002030,推测第三个将5060补全为005060,可见windows是将位数少的用00高位填充补全。
最后看看java的处理方式,先看异或函数
public static byte[] XOR(byte[] B1, byte[] B2) {
BigInteger big1=new BigInteger(B1);
BigInteger big2=new BigInteger(B2);
return big1.xor(big2).toByteArray();
}
下面是计算结果
507050
407050
107050
可见java处理方式和windows系统的一样,都是将位数少的用00高位填充补全。
希望这样可以帮助那些进行代码移植的人。
给出修改后的代码,getMergeBytes为合并两个数组。这里只是针对末尾填充00的,如果首位填充,只需调整getMergeBytes参数先后顺序就行。还有就是位数短的用自身补齐,根据取模和余数进行计算;更简单的就是循环按位异或计算。
public static byte[] XOR_ORACLE(byte[] B1, byte[] B2) {
if(B1.length>B2.length){
B2=getMergeBytes(B2, new byte[B1.length-B2.length]);
}else if(B1.length<B2.length){
B1=getMergeBytes(B1, new byte[B2.length-B1.length]);
}
BigInteger big1=new BigInteger(B1);
BigInteger big2=new BigInteger(B2);
return big1.xor(big2).toByteArray();
}