当前位置:  开发笔记 > 编程语言 > 正文

通过JSON发送64位值的可接受方式是什么?

如何解决《通过JSON发送64位值的可接受方式是什么?》经验,为你挑选了3个好方法。

我的一些数据是64位整数.我想将这些发送到页面上运行的JavaScript程序.

但是,据我所知,大多数JavaScript实现中的整数都是32位有符号数.

我的两个选择似乎是:

    将值作为字符串发送

    将值作为64位浮点数发送

选项(1)并不完美,但选项(2)似乎远不那么完美(数据丢失).

你是怎么处理这种情况的?



1> Simon Howard..:

这似乎不是JSON的问题,而是Javascript本身的问题.你打算用这些数字做什么?如果它只是一个魔术令牌,你需要稍后传回网站,一定只需使用包含该值的字符串.如果你真的必须对值进行算术运算,你可以为64位算术编写自己的Javascript例程.

您可以在Javascript(以及JSON)中表示值的一种方法是将数字拆分为两个32位值,例如.

  [ 12345678, 12345678 ]

要将64位值拆分为两个32位值,请执行以下操作:

  output_values[0] = (input_value >> 32) & 0xffffffff;
  output_values[1] = input_value & 0xffffffff;

然后将两个32位值重新组合为64位值:

  input_value = ((int64_t) output_values[0]) << 32) | output_values[1];


@akhaku:当我误解语法时,我在我脑海中发明的规范版本(RFC 4627和www.json.org).:)

2> Arnaud Bouch..:

事实上,JavaScript/ECMAScript精度水平的限制为整数的53位(它们存储在"双样"8字节内存缓冲区的尾数中).因此,传输大数字作为JSON将不会像JavaScript客户端所期望的那样被反序列化,这会将它们截断为53位分辨率.

> parseInt("10765432100123456789")
10765432100123458000

Number.MAX_SAFE_INTEGER常量和 Number.isSafeInteger()函数:

MAX_SAFE_INTEGER常数具有的价值9007199254740991.后面这个数字的原因是在IEEE 754规定,只能安全地之间代表数字,JavaScript使用双精度浮点数数字-(2^53 - 1)2^53 - 1.

在这种情况下,安全是指能够准确表示整数并正确比较它们的能力.例如, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2将评估为true,在数学上是不正确的.有关Number.isSafeInteger()更多信息,请参阅

由于JavaScript中浮点数的分辨率,使用你提出的"64位浮点数"会受到同样的限制.

恕我直言,最好的选择是传输这样的值作为文本.它仍然是完全可读的JSON内容,并且很容易在JavaScript级别上工作.

"纯字符串"表示是OData为其Edm.Int64Edm.Decimal类型指定的表示.

在这种情况下,Twitter API的作用是".._str":在JSON中添加特定字段,如下所示:

{
   "id": 10765432100123456789,           // for JSON compliant clients
   "id_str": "10765432100123456789",     // for JavaScript
    ...
}

我非常喜欢这个选项,因为它仍然可以与支持int64的客户端兼容.实际上,如果在HTTP级别进行放气/压缩,JSON中的这种重复内容不会受到太大影响.

一旦作为字符串传输,您可以使用像strint这样的库 - 一个用于字符串编码的整数的JavaScript库来处理这些值.



3> David Leonar..:

Javascript的数字类型(64位IEEE 754)仅具有约53位的精度.

但是,如果您不需要进行任何添加或乘法,那么您可以将64位值保持为4个字符的字符串,因为JavaScript使用UTF-16.

例如,1可以编码为"\ u0000\u0000\u0000\u0001".这样做的优点是值比较(==,>,<)可以按预期方式处理字符串.写位操作似乎也很简单:

function and64(a,b) {
    var r = "";
    for (var i = 0; i < 4; i++)
        r += String.fromCharCode(a.charCodeAt(i) & b.charCodeAt(i));
    return r;
}

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有