Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过JSON发送64位值的公认方式是什么?_Javascript_Json_64 Bit - Fatal编程技术网

Javascript 通过JSON发送64位值的公认方式是什么?

Javascript 通过JSON发送64位值的公认方式是什么?,javascript,json,64-bit,Javascript,Json,64 Bit,我的一些数据是64位整数。我想把它们发送到一个运行在页面上的JavaScript程序 然而,据我所知,大多数JavaScript实现中的整数都是32位有符号量 我的两个选择似乎是: 将值作为字符串发送 将值作为64位浮点数发送 选项(1)并不完美,但选项(2)似乎不那么完美(数据丢失) 您是如何处理这种情况的?JSON本身并不关心实现限制。 你的问题是JS不能处理你的数据,而不是协议。 换句话说,您的JS客户端代码必须使用这些非完美选项中的任何一个。这似乎不是JSON的问题,而是Javascri

我的一些数据是64位整数。我想把它们发送到一个运行在页面上的JavaScript程序

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

我的两个选择似乎是:

  • 将值作为字符串发送
  • 将值作为64位浮点数发送
  • 选项(1)并不完美,但选项(2)似乎不那么完美(数据丢失)


    您是如何处理这种情况的?

    JSON本身并不关心实现限制。 你的问题是JS不能处理你的数据,而不是协议。
    换句话说,您的JS客户端代码必须使用这些非完美选项中的任何一个。

    这似乎不是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];
    

    input_value=((int64_t)output_values[0])JS数字表示是标准的ieee双精度,因此不能表示64位整数。iirc您可能在一个double中获得48位的实际int精度,但所有JS位操作都会降低到32位精度(这是规范要求的。耶!),因此如果您确实需要JS中的64位int,您需要实现自己的64位int逻辑库。

    Javascript的数字类型(64位IEEE 754)只有大约53位精度

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


    例如,1可以编码为“\u0000\u0000\u0000\u0001”。这样做的优点是,值比较(=,>,实际上,JavaScript/ECMAScript级别的精度限制为53位整数(它们存储在“类似双精度”的8字节内存缓冲区的尾数中)。因此,作为JSON传输大数字不会像JavaScript客户端预期的那样被取消序列化,JavaScript客户端会将它们截断为53位分辨率

    > parseInt("10765432100123456789")
    10765432100123458000
    
    请参阅and
    Number.isSafeInteger()
    函数:

    MAX_SAFE_INTEGER
    常量的值为
    9007199254740991
    这个数字背后的原因是JavaScript使用了双精度 IEEE 754中规定的浮点格式编号,只能 安全地表示介于
    -(2^53-1)
    2^53-1
    之间的数字

    在此上下文中,Safe指的是表示整数的能力 准确和正确地比较它们。例如,
    Number.MAX\u SAFE\u INTEGER+1==Number.MAX\u SAFE\u INTEGER+2
    将 计算为
    true
    ,这在数学上是不正确的。请参阅
    Number.isSafeInteger()
    了解更多信息

    由于JavaScript中浮点数的解析,使用您建议的“64位浮点数”将受到完全相同的限制

    IMHO最好的选择是以文本的形式传输这些值。它仍然是完全可读的JSON内容,并且在JavaScript级别很容易使用

    “纯字符串”表示是什么

    在本例中,Twitter API的作用是在JSON中添加一个特定的
    “。\u str:
    字段,如下所示:

    {
       "id": 10765432100123456789,           // for JSON compliant clients
       "id_str": "10765432100123456789",     // for JavaScript
        ...
    }
    
    我非常喜欢这个选项,因为它仍然与支持int64的客户端兼容。实际上,如果在HTTP级别对JSON中的重复内容进行压缩/gzip,那么JSON中的重复内容不会造成太大的伤害

    一旦作为字符串传输,您可以使用类似库的方法来处理这些值


    更新:较新版本的JavaScript引擎包含一个对象类,该类能够处理53位以上的数据。事实上,它可以用于任意大的整数,因此非常适合64位整数值。但是当序列化为JSON时,BigInt值-很奇怪,但出于兼容性目的,我想。

    ng发生在我身上。当通过json将大整数发送到json.parse时,一切都变得一团糟。我花了好几天的时间尝试调试。当我将值作为字符串传输时,问题立即得到解决

    使用
    
    
    {“序列号”:“20200707105904535”}
    而不是
    
    
    {“序列号”:20200707105904535}

    更糟糕的是,每个JSON.parse的实现位置似乎都是Firefox、Chrome和Opera之间的共享库,因为它们的行为完全相同。Opera错误消息中包含Chrome URL引用,几乎就像浏览器共享的WebKit一样

    
    

    我得到的行为是指针数学变得非常糟糕的那种东西。幽灵从我的工作站飞出,在我的睡眠中造成严重破坏。现在我切换到字符串,它们都被驱除了。

    当我尝试“input\u value>>32”时,我只得到了“input\u value”,就好像32位刚刚被完全包围一样。“>>”但当我尝试“Math.floor(input_value/4294967296)”(4294967296=Math.pow(2,32)),我得到了“input_value”的高32位部分;我遗漏了什么?你没有说你在使用什么语言,所以我假设你在使用Java。“input_value”是长的(即64位整数)?如果是int(32位整数),则位左移32位将不起作用。这仍然是一个JSON问题,而不是Javascript问题,因为JSON不支持超过9位小数的整数。如果支持,Javascript实现将被迫在某种程度上提供对它的支持。@LightnessRacesinOrbit,我看不出来
    {
       "id": 10765432100123456789,           // for JSON compliant clients
       "id_str": "10765432100123456789",     // for JavaScript
        ...
    }
    
    console.log('event_listen[' + global_weird_counter + ']: to be sure, server responded with [' + aresponsetxt + ']');
    var response = JSON.parse(aresponsetxt);
    console.log('event_listen[' + global_weird_counter + ']: after json parse: ' + JSON.stringify(response));