You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中实现Oracle的TO_NUMBER十六进制转换功能?

如何在Java中实现Oracle TO_NUMBER函数处理十六进制字符串的功能

问题原因

Oracle的TO_NUMBER('DE82C38142C69491', 'XXXXXXXXXXXXXXXX')会将16位十六进制字符串解析为无符号64位整数,输出对应的十进制值。而Java的long是有符号64位类型,当十六进制字符串的最高位为1时,解析后的long值会被当作负数显示,但实际上解析的无符号数值是正确的,只是展示方式导致了差异。

解决方案

方法一:利用Long类的无符号处理方法

Long.parseUnsignedLong已经按照无符号逻辑解析了十六进制字符串,只需将解析后的long值转换为无符号十进制字符串即可得到和Oracle一致的结果:

public class OracleToNumberDemo {
    public static void main(String[] args) {
        String hexInput = "DE82C38142C69491";
        long parsedValue = Long.parseUnsignedLong(hexInput, 16);
        // 转换为无符号十进制字符串
        String oracleCompatibleResult = Long.toUnsignedString(parsedValue);
        System.out.println(oracleCompatibleResult); // 输出:16033592583330894993
    }
}

方法二:使用BigInteger(通用场景)

如果需要处理更长的十六进制字符串(超过64位),或者希望更直观地处理无符号整数,推荐使用BigInteger:

import java.math.BigInteger;

public class OracleToNumberDemo {
    public static void main(String[] args) {
        String hexInput = "DE82C38142C69491";
        BigInteger bigInteger = new BigInteger(hexInput, 16);
        String oracleCompatibleResult = bigInteger.toString();
        System.out.println(oracleCompatibleResult); // 输出:16033592583330894993
    }
}

验证

两种方法输出的结果均与Oracle TO_NUMBER函数返回的16033592583330894993完全一致。

内容的提问来源于stack exchange,提问作者RamG213

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:10:20