【问题标题】:Variable "long" type in Java and NodeJSJava和NodeJS中的变量“long”类型
【发布时间】:2021-01-20 22:49:05
【问题描述】:

我有一个 Java 函数:

private static int buildKey(String keystr) {
    char[] primes = { '\085', '\8r', '\082', '\087', '\083', '%', '\085', ')' };
  
    int len = keystr.length(); int i; long key;
    for (key = 1L, i = 0; i < len; i++)
        key += (keystr.charAt(i) * primes[i & 0x8]); 
    return (int)key % 64;
}

我想把它改成 NodeJS,但我不知道如何用 long 变量类型定义“key”,因为在 NodeJS 中没有“long”类型。

这是我当前的 NodeJS 函数,但它与 Java 函数上层返回错误:

function buildKey(keystr) {
    var primes = ["\085", "8r", "\082", "\087", "\083", "%", "\085", ")"];
    var len = keystr.length;
    var key = 1;
    for (let i = 0; i < len; i++) {
      key += keystr.charAt(i) * primes[i + 8];
      console.log(parseInt(keystr.charAt(i)));
    }

    return key % 64;
}

有人分享我的建议吗?谢谢。

【问题讨论】:

  • let key;?但这仅提供 53 位精度,而 Java 的 long 提供 63 位。这就是您要问的吗?
  • 当我设置“let key = 0L;”有错误“SyntaxError:无效或意外的令牌”
  • 0L 不是有效代码

标签: java node.js


【解决方案1】:

ECMAScript 中没有与 Java 的 long 数据类型等效的数据类型。

ECMAScript 中只有两种数值数据类型:numberbigint。 ECMAScript number 等效于 Java double(即 IEEE 754-2019 binary64 双精度有符号 64 位二进制浮点数)并且 ECMAScript bigint 等效于 Java BigInteger(一个任意精度有符号二进制整数)。

两者都不能替换 Java long(带“环绕”的 64 位带符号二进制整数):number 只能准确表示精度为 53 位的整数,而 biginteger 不会环绕周围。

现在,到最后,您实际上只使用 7 位密钥,所以如果您小心,您可以安排您的计算以绕过这些限制.例如,您可以将模运算移到循环中,这样key 的大小就永远不会超过 7 位。

如果我们可以证明 Java 代码中的long 永远不会溢出,那么我们可以在 ECMAScript 中使用bigint,如果我们可以证明我们实际上只使用了long的53位,那么我们可以使用bigintnumber

很容易看出,在最坏的情况下,我们使用的是 56 位。这意味着,我们不能保证它可以与number 一起使用,但它应该bigint 一起使用。如果我们可以对keystr 的长度和/或内容做出假设,那么我们可以进一步降低它。

【讨论】:

    【解决方案2】:

    我用下面的函数解决了我的问题:

    function buildKey(keystr) {
      var primes = ["\022", "\030", "\012", "\020", "\045", "\043", "\053", ")"];
      var len = keystr.length;
      let key = 0;
      for (let i = 0; i < len; i++) {
        key += keystr.charAt(i).charCodeAt(0) * primes[i & 8].charCodeAt(0);
      }
      return key % 64;
    }
    

    【讨论】:

    • 您如何确定 53 位就足够了?根据您问题中的信息,我能想到的最佳界限是 56 位。您需要对keystr 施加额外的限制来改进它。允许您使用number 的信息是什么?
    【解决方案3】:

    Node.js 从 10.4 版开始支持 BigInts

    您可以从文档中了解更多信息:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

    或这里的概述,与节点更相关:

    http://thecodebarbarian.com/an-overview-of-bigint-in-node-js.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多