我在Java中使用以下代码将十六进制值转换为长数字,在示例中我使用了值:' B4EEB49B04C0'
public static long HexStr2Long(String value)
{
value = value.toUpperCase();
long result = 0;
for (int i = 0; i < value.length(); i++)
{
int x = value.length() - i - 1;
char ch = value.charAt(i);
result += keys.indexOf(ch) * Pow(exponent, x);
}
return result;
}
public static long Pow(long baseNo, long x)
{
long value = 1;
while (x > 0)
{
value = value * baseNo;
x--;
}
return value;
}
public static void main(String[] args) {
long result = HexStr2Long("B4EEB49B04C0");
System.out.print("resultado: "+result+"\n");
}
结果是:1463925582232863984
现在,我在Javascript中创建了等效代码:
pow = function(baseNo, x){
var value = 1;
while(x > 0){
value = value * baseNo;
x--;
}
return value;
}
hexStr2Long = function(val){
var keys = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var exponent = keys.length;
val = val.toUpperCase();
var result = 0;
for (var i = 0; i < val.length; i++) {
var x = val.length - i - 1;
var ch = val.charAt(i);
result += keys.indexOf(ch) * Math.pow(exponent, x);
}
return result;
}
var r = hexStr2Long(wifimac);
console.log('Result: '+r);
结果是:1463925582232864000,这个错误,它必须与Java代码相同。
我怎样才能做到这一点?我已经尝试过使用该库(BigNumber),但没有成功。
答案 0 :(得分:2)
1463925582232864000是最近的64位IEEE-754浮点数到1463925582232863984.Javascript中的数字(目前 - 我相信这是在变化)总是64位IEEE-754浮点数。
基本上,为了做到这一点,你需要一个支持数字类型其他的Javascript库,而不是内置的。(我希望BigNumber可以工作,但是你还没有向我们展示你用它做了什么,所以很难知道你做错了什么。)
答案 1 :(得分:0)
以下是有关原因的一些信息: https://modernweb.com/what-every-javascript-developer-should-know-about-floating-points/
问题在于Javascript的浮点精度。
你总是可以尝试像Math.js这样的另一个库
答案 2 :(得分:0)
经过一些实验,我看到0xB4EEB49B04C0处于IEEE-754 FP十六进制表示中。所以这个答案根本不合适。
1463925582232863984是输入的正确十进制表示形式!
因此,您应该使用支持IEEE-754输入的bignumber库。
IGNORE旧回答
使用BigNumber按预期工作:
var r2 = new BigNumber("B4EEB49B04C0", 16);
console.log(r2.toString());
它输出198937325274304.此外,在线bignumber转换器给出了这个结果。 这使我怀疑Java代码的输出也是错误的。你能否证实“1463925582232863984”是正确的结果?
输入是48位数字,因此它不能大于支持的最大64位数。您的发布结果应等于“1450e88f9298c4f0”作为输入。