【发布时间】:2011-11-12 16:08:17
【问题描述】:
我正在 node.js 中编写一个聊天服务器,我想将连接的用户 IP 地址作为(无符号)整数存储在 mysql 数据库中。 我编写了一个 javascript 方法来将 IP 地址作为字符串转换为整数。然而,我得到了一些奇怪的结果。
这是我的代码:
function ipToInt(ip) {
var parts = ip.split(".");
var res = 0;
res += parseInt(parts[0], 10) << 24;
res += parseInt(parts[1], 10) << 16;
res += parseInt(parts[2], 10) << 8;
res += parseInt(parts[3], 10);
return res;
}
当我以ipToInt("192.168.2.44"); 运行该方法时,我得到的结果是-1062731220。
似乎发生了溢出,这很奇怪,因为预期的输出 (3232236076) 在 javascript (2^52) 的数字范围内。
当我以二进制形式检查 -1062731220 时,我可以看到 3232236076 被保留,但前面填充了 1。
我不确定,但我认为问题在于有符号整数和无符号整数。
你们中的任何人都可以解释发生了什么吗?
以及如何将-1062731220 解析回字符串 ip?
【问题讨论】:
-
您的整个 ipToInt 函数可以替换为:
new Buffer(ip.split('.')).readInt32BE(0) -
关于 Nikolai 的解决方案 - 在某些情况下,这会抛出 RangeError('尝试访问超出缓冲区长度')
标签: javascript