【问题标题】:Cordova NFC getting NFC tag value in decCordova NFC 在 12 月获得 NFC 标签值
【发布时间】:2016-06-27 13:26:15
【问题描述】:

简单的问题。我正在构建一个 Cordova 应用程序,其中包括使用 NFC 标签验证用户。我必须在 12 月获取数据。

我已经完成了所有设置,但我得到的响应却是 8 点。

我知道我可以通过添加 +8 来解决它,但这只是解决问题。

这是我目前的计算函数:

function intFromBytes( x ){

    var result = 0;
    var factor = 1;
    for (var i = 0; i < x.length; ++i) {
        var value = x[i] & 255;
        result += value * factor;
        factor *= 256;
    }
    return result;
}

例如下面的数组:

 0: 4, 1: 117, 2: 64, 3: 114, 4: -23, 5: 51, 6: -126

在我期待(并从不同的 NFC 应用程序获取)36648824709608708 时转换为 36648824709608700

【问题讨论】:

  • 这似乎对我有用。您能否提供一个输入和输出示例以及您的预期输出?
  • 添加了有问题的示例。我用两个不同的应用程序检查过,它们都增加了 8 个。

标签: javascript cordova decimal nfc


【解决方案1】:

您遇到的问题与 JavaScript 数字的表示方式有关。如果您查看 Number.MAX_SAFE_INTEGER 的值,您会发现您尝试表示的数字超出了 JavaScript 整数精度的限制

来自 Mozilla 开发者网络网站上的 Number.MAX_SAFE_INTEGER

MAX_SAFE_INTEGER 常量的值为 9007199254740991。该数字背后的原因是 JavaScript 使用 IEEE 754 中指定的双精度浮点格式数字,并且只能安全地表示介于 -(2^53 - 1) 和2^53 - 1.

如果您尝试使用不同的 NFC 标签,您会得到不同数量的响应。

您将不得不使用可以处理大整数值的 JS 库,例如 big-integer

function bigIntFromBytes(bytes){

    var result = bigInt();
    var factor = bigInt(1);
    for (var i = 0; i < bytes.length; ++i) {
        var value = bytes[i] & 255;
        result = result.add(bigInt(value).times(factor));
        factor = factor.times(256);
    }

    return result;
}

var bytes = [4, 117, 64, 114, -23, 51, -126];

bigIntFromBytes(bytes).toString(); // gives 36648824709608708

【讨论】:

  • 是的,这节省了一天!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多