c和java异或结果不同_java与oracle异或的不同

异或是计算两组相同长度数据的,现在我们测试一下对于不用长度数据的处理结果。

首先来看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

B1=getMergeBytes(B1, new byte[B2.length-B1.length]);

}

BigInteger big1=new BigInteger(B1);

BigInteger big2=new BigInteger(B2);

return big1.xor(big2).toByteArray();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值