关于数据转换:Java中如何将11位十六进制数转换为唯一的11位十进制数?

How to convert 11 digit hexadecimal number to unique 11 digit decimal number in Java?

我们有一个非常奇怪的要求,将 11 位十六进制数(范围从 (A0000000001 ~ AFFFFFFFFFF) )转换为 11 位十进制数。十六进制到整数之间应该有 1:1 的映射。有没有办法在 Java 中做到这一点?


这是不可能的,在 Java 或任何其他语言或系统中都是不可能的。这种不可能性是数字和集合论的基本属性。

由于前导 0xA 没有改变,因此您实际拥有的是 10 位十六进制数字值,或 40 位数据。

这包含大约 1.1 x 1012 个可能的值,因此无法将其映射到 11 位十进制数,根据定义,它只有 1011 个可能的值。

根据评论,我将更明确地说明这一点。从 0xA0000000000 开始并将其映射到十进制 00000000000,然后将两者都加 1 以在两组成员之间建立一一对应关系并重复:

1
2
3
4
5
6
7
8
9
10
11
12
13
0xA0000000000 -> 00000000000
0xA0000000001 -> 00000000001
0xA0000000002 -> 00000000002
...
0xA0000000010 -> 00000000016
...
0xA0000000100 -> 00000000256
...
0xA0000001000 -> 00000004096
...
0xA174876E7FF -> 99999999999
...
0xA174876E800 -> oops! overflow!  too many digits

换句话说,0xA00000000000xAFFFFFFFFFF之间的所有十六进制值的集合的大小大于0000000000099999999999之间的所有十进制值的集合。


1
2
String hexNumber = ...
int decimal = Integer.parseInt(hexNumber, 16);

不确定是否需要显示十个字符。如果是这样,这里有一些代码可以将其转换为字符串并填充前导零。

1
2
3
4
5
6
7
8
9
10
11
12
13
String decNumber = Integer.toString(decimal);


public static String padLeadingZeros(String data, int requiredLength){
    StringBuffer sb = new StringBuffer();

    int numLeadingZeros = requiredLength - data.length();
    for (int i=0; i < numLeadingZeros; i++){
        sb.append("0");
    }
    sb.append(data);
    return sb.toString();
}