Cordova NFC 在 12 月获取 NFC 标签值

Cordova NFC getting NFC tag value in dec

简单的问题。我正在构建一个 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 应用程序获取)时转换为 36648824709608700 36648824709608708

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

的限制

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

The MAX_SAFE_INTEGER constant has a value of 9007199254740991. The reasoning behind that number is that JavaScript uses double-precision floating-point format numbers as specified in IEEE 754 and can only safely represent numbers between -(2^53 - 1) and 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