KdB+ - HTML5 websocket 解串器不适用于 Long 数据类型
KdB+ - HTML5 websocket deserializer not working for Long data type
我正在使用 https://github.com/KxSystems/kdb/blob/master/c/c.js 的解串器将 HTML 5 websocket 连接到 KdB+ 后端。从后端发送类型为 j(long) 的空值时,我遇到了问题。由于某种原因,反序列化器将其映射到 64 位整数最小值,即 -9223372036854775808。不过,非空值正在被正确反序列化。这只发生在 null long 值上,null int 和 float 被正确反序列化。
正如 user2393012 在评论中正确指出的那样,KdB+ 的序列化程序将 0N(null) 映射到数据类型的最小值。因此,Long 类型的空值被序列化为 -9223372036854775808。
反序列化器正在为 16 位和 32 位值正确处理此整数 min,如下面的代码所示。
function rInt16(){rNUInt8(2);var h=hb[0];return h==-32768?NaN:h==-32767?-Infinity:h==32767?Infinity:h;}
function rInt32(){rNUInt8(4);var i=ib[0];return i==-2147483648?NaN:i==-2147483647?-Infinity:i==2147483647?Infinity:i;}
然而,64 位整数的反序列化器不对最小值执行任何检查,如下所示
function rInt64(){rNUInt8(8);var x=ib[1],y=ib[0];return x*j2p32+(y>=0?y:j2p32+y);}// closest number to 64 bit int...
这是因为 javascript 只能安全地处理最大 +/- 2^53 的整数。有关 JS 整数的更多信息,请参阅此 link。
我通过妥协解决了这个问题,即我的应用程序将只处理高达 +/- 2^53 的值,而超出此范围的任何值都将由反序列化器作为 NaN 返回,如下所示。
function rInt64(){
rNUInt8(8);
var x=ib[1],y=ib[0];
var ret = x*j2p32+(y>=0?y:j2p32+y);
if(ret > Number.MAX_SAFE_INTEGER || ret < Number.MIN_SAFE_INTEGER)
return NaN;
return ret;
}
如果您的应用程序仍然需要处理所有 64 位整数,我建议您在 KdB+ 发送数据之前将整数转换为 String 并使用 JS 中可用的一些 Big Int 库再次构造整数来自字符串。
我正在使用 https://github.com/KxSystems/kdb/blob/master/c/c.js 的解串器将 HTML 5 websocket 连接到 KdB+ 后端。从后端发送类型为 j(long) 的空值时,我遇到了问题。由于某种原因,反序列化器将其映射到 64 位整数最小值,即 -9223372036854775808。不过,非空值正在被正确反序列化。这只发生在 null long 值上,null int 和 float 被正确反序列化。
正如 user2393012 在评论中正确指出的那样,KdB+ 的序列化程序将 0N(null) 映射到数据类型的最小值。因此,Long 类型的空值被序列化为 -9223372036854775808。
反序列化器正在为 16 位和 32 位值正确处理此整数 min,如下面的代码所示。
function rInt16(){rNUInt8(2);var h=hb[0];return h==-32768?NaN:h==-32767?-Infinity:h==32767?Infinity:h;}
function rInt32(){rNUInt8(4);var i=ib[0];return i==-2147483648?NaN:i==-2147483647?-Infinity:i==2147483647?Infinity:i;}
然而,64 位整数的反序列化器不对最小值执行任何检查,如下所示
function rInt64(){rNUInt8(8);var x=ib[1],y=ib[0];return x*j2p32+(y>=0?y:j2p32+y);}// closest number to 64 bit int...
这是因为 javascript 只能安全地处理最大 +/- 2^53 的整数。有关 JS 整数的更多信息,请参阅此 link。
我通过妥协解决了这个问题,即我的应用程序将只处理高达 +/- 2^53 的值,而超出此范围的任何值都将由反序列化器作为 NaN 返回,如下所示。
function rInt64(){
rNUInt8(8);
var x=ib[1],y=ib[0];
var ret = x*j2p32+(y>=0?y:j2p32+y);
if(ret > Number.MAX_SAFE_INTEGER || ret < Number.MIN_SAFE_INTEGER)
return NaN;
return ret;
}
如果您的应用程序仍然需要处理所有 64 位整数,我建议您在 KdB+ 发送数据之前将整数转换为 String 并使用 JS 中可用的一些 Big Int 库再次构造整数来自字符串。