比较 Lua 的 toNumber 和 JS 的 parseInt - 结果不匹配

我正在将一段 Lua 脚本转换为 JavaScript(NodeJS 平台),但我遇到了一个奇怪的问题,我无法理解。

我正在转换的功能很简单,它获取 FiveM 标识符(由 fivem 记录的用户的 steamid),并将其从十六进制转换为十进制。然后将十进制值传递给 steam Web API,以便我们可以解析 json 响应以获取个人资料名称/头像等。

代码本身没有问题。问题在于转换。由于显而易见的原因,我不能发布 API 密钥或 steam ID,因此我将其留空以进行演示。

在 LUA 中:

local steamid = tonumber(tempSteam,16)

检索十六进制 steam id 并转换为十进制。

在 JS 中:

var steamid = parseInt(tempSteam,16);

等价于上面的 JS。

奇怪的是,这样做。在 JS 中传递 tempSteam 导致 steamid 结尾 ###0,这与我的个人资料不匹配,我的个人资料结尾 ###6(所有其他数字都相同)。

编辑:删减解释内容,我已经发现(感谢评论)JS 不能转换 64 位值。所以现在我需要找到解决办法。

点赞
用户14576226
用户14576226

感谢评论区提供了未知的信息,我不知道 JS 不能本地处理 64 位数字。

我已经找到了一个解决方案,所以在这里发布以防其他人遇到此问题。

NodeJS 10+ 有一个新的 BigInt 函数,它可以将 hex 值转换为 64 位有符号整数。

// 我们的 steamhex 变量,通常通过 FiveM 的标识符获取
// 所以此常量仅用于演示其含义。
// 0x 很重要,没有它,BigInt 函数似乎会失败并显示通用“无法转换”。
const steamHex = '0x110000103d27e1d';

// 如果使用 FiveM,请使用一个替换,例如
// steamHex = steamHex.replace('steam:','0x');

// 返回 76561198024392221
var result = BigInt(steamHex);

// ... 将结果放入您的 steam api 调用等等...
2021-02-04 16:32:25