考虑以下btoa
输出
btoa(99999999999999999999)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"
btoa(99999999999999999998)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"
btoa("99999999999999999998")
"OTk5OTk5OTk5OTk5OTk5OTk5OTg="
btoa("99999999999999999999")
"OTk5OTk5OTk5OTk5OTk5OTk5OTk="
我们看到,btoa
它无法对20位数的唯一哈希进行编码,int
但能够对20位数进行编码string
。为什么是这样?
我最初的猜测是,既然btoa
是base,64
它只能编码小于base的东西64
,但是为什么它却可以编码20位数string
呢?
此外BTOA似乎无法编码int
不到9223372036854775807
这是一种2^63
btoa(9223372036854775302)
"OTIyMzM3MjAzNjg1NDc3NjAwMA=="
btoa(9223372036854775303)
"OTIyMzM3MjAzNjg1NDc3NjAwMA=="
由于浮点数不精确。请记住,除了某些计算过程中的临时功能外,JavaScript没有整数。所有JavaScript数字都是IEEE-754双精度浮点数。99999999999999999999
在IEEE-754数字中不是一个安全的整数值,实际上,如果您这样做:
console.log(99999999999999999999);
...你会看到的
100000000000000000000
最大安全整数(例如,不受浮点不精确度影响的整数)为9007199254740991
。
由于btoa
接受字符串(当您传递数字时,数字只会转换为字符串),因此只需在您的值两边加上引号即可:
btoa("99999999999999999999")
=> OTk5OTk5OTk5OTk5OTk5OTk5OTk=
当然,如果该值是数学计算的结果,则不能这样做。您必须更改计算如此大的数字的方法,因为它们超出了数字类型的精确范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句