为什么 javascript 中的“btoa”编码适用于 20 位字符串而不是 20 位整数

Why does `btoa` encoding in javascript works for 20 digit string and not 20 digit int?

本文关键字:字符串 整数 适用于 中的 javascript btoa 编码 为什么      更新时间:2023-09-26

请考虑以下btoa输出

btoa(99999999999999999999)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"
btoa(99999999999999999998)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"
btoa("99999999999999999998")
"OTk5OTk5OTk5OTk5OTk5OTk5OTg="
btoa("99999999999999999999")
"OTk5OTk5OTk5OTk5OTk5OTk5OTk="

我们看到btoa无法编码 20 位int的唯一哈希,但能够编码 20 位string。这是为什么呢?

我最初的猜测是,既然btoa是基数64它只能编码小于基数64的东西,但为什么它能够编码 20 位数字string呢?

此外,btoa似乎无法编码小于9223372036854775807 int这是一个2^63

btoa(9223372036854775302)
"OTIyMzM3MjAzNjg1NDc3NjAwMA=="
btoa(9223372036854775303)
"OTIyMzM3MjAzNjg1NDc3NjAwMA=="

因为浮点不精确。请记住,JavaScript 没有整数,除非在某些计算过程中暂时使用;所有 JavaScript 数字都是 IEEE-754 双精度浮点数。 99999999999999999999 不是 IEEE-754 数字中的安全整数值,实际上,如果您这样做:

console.log(99999999999999999999);

。你会知道的

100000000000000000000

最大安全整数(例如,不受浮点精度影响的整数(为 9007199254740991

由于btoa接受一个字符串(当你给它传递一个数字时,这个数字就会被转换为字符串(,只需在你的值周围加上引号:

btoa("99999999999999999999")
=> OTk5OTk5OTk5OTk5OTk5OTk5OTk=

当然,如果该值是数学计算的结果,则不能这样做。您必须更改计算如此大的数字的任何内容,因为它们超出了数字类型的精确范围。