我们有一个非常奇怪的要求将11位十六进制数(范围从(A0000000001~AFFFFFFFFFF))转换为11位十进制数。并且十六进制与整数之间应该存在1:1的映射。有没有办法在Java中这样做?
答案 0 :(得分:8)
这在Java或任何其他语言或系统中是不可能的。这种不可能性是数字和集合论的基本属性。
由于前导0xA
没有改变,你实际拥有的是10-hex数字值,或40位数据。
这包含大约1.1 x 10 12 可能的值,因此无法将其映射到11位十进制数,根据定义,它只有10 11 可能的价值观。
基于这些评论,我将使其更加明确。从0xA0000000000
开始并将其映射到十进制00000000000
,然后将两者递增1以在两组成员之间建立一对一的对应关系并重复:
0xA0000000000 -> 00000000000
0xA0000000001 -> 00000000001
0xA0000000002 -> 00000000002
...
0xA0000000010 -> 00000000016
...
0xA0000000100 -> 00000000256
...
0xA0000001000 -> 00000004096
...
0xA174876E7FF -> 99999999999
...
0xA174876E800 -> oops! overflow! too many digits
换句话说,0xA0000000000
和0xAFFFFFFFFFF
之间所有十六进制值的集合大小大于00000000000
和99999999999
之间所有十进制值的集合。
答案 1 :(得分:0)
String hexNumber = ...
int decimal = Integer.parseInt(hexNumber, 16);
不确定是否需要显示10个字符。如果是这样,这里有一些代码将其转换为字符串并填充前导零。
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();
}