例如…应用十六进制"DE82C38142C69491"到Oracle TO_NUMBER结果如下:
select TO_NUMBER('DE82C38142C69491', 'XXXXXXXXXXXXXXXX') from dual
/*
result :
16033592583330894993
*/
我在Java中尝试了这个,代码如下:
Long.parseUnsignedLong("DE82C38142C69491", 16);
/*
result :
-2413151490378656623
*/
我理解错了。有一种方法来使用Oracle的TO_NUMBER在Java?
十六进制数DE82C38142C69491为-2413151490378656623。
Java的长整数是有符号的,D设置了顶位,所以DE82C38142C69491表示一个负数。
运行System.out.println(Long.toHexString(-2413151490378656623L));
,你会看到你得到了DE82C38142C69491
。
这样就得到了原始十六进制数的所有位。
你可以使用new BigInteger("DE82C38142C69491", 16);
,它会给你一个包含16033592583330894993的BigInteger,但是-2413151490378656623已经包含了你所有的位。
Java的long
是一个有符号的64位整数类型,支持范围从-263到263-1。
long
添加了一些方法,例如Long.compareUnsigned(long x, long y)
。虽然旧的方法将继续将long
值视为有符号的,但这些新方法的范围为0到264-1。文档说明:
在Java SE 8及以后的版本中,您可以使用long数据类型来表示无符号64位长,最小值为0,最大值为0264-1.
这只是一种不同的解释。
System.out.println(Long.parseUnsignedLong("DE82C38142C69491", 16));
…它实际上调用了Long.toString()
,将输出:
-2413151490378656623
但是如果你……
System.out.println(Long.toUnsignedString(Long.parseUnsignedLong("DE82C38142C69491", 16)));
…您将得到:
16033592583330894993
这是因为16033592583330894993
大于263-1,但也小于264-1。
不过,如果你处理的是这么大的数字,你可能最好使用BigInteger
。