IPv4转INT
IP地址通常由四个整数组成,每个整数在0到255之间,他们之间用点分隔。
function ipToInt(ip) {
// 将IP地址拆分为四个整数
const ipArray = ip.split(".").map(Number);
// 确保IP地址的有效性
if(ipArray.length !== 4 || ipArray.some(num=>isNaN(num) || num < 0 || num > 255)){
throw new Error('Invalid IP address format');
}
// 计算整数表示
const intRepresentation = (ipArray[0] << 24) | (ipArray[0] << 16) | (ipArray[0] << 8) | ipArray[3];
return intRepresentation >>> 0; // 确保结果为无符号整数
}
// 示例
const ipAddress = '192.168.1.1';
const result = ipToInt(ipAddress);
console.log(result);
这段代码首先将IP地址分为四个整数,然后通过位运算将它们组合成一个32位整数。最后,使用 >>> 0确保结果是一个无符号整数。请注意,这里使用Number函数将拆分的字符串转换为整数,以确保正确的比较和位运算。
IPv6转INT
IPv6地址中允许出现全零简写(‘::’), 下面是严格按照没有简写的正常IPv6地址格式(8个段,每个段由1到4个十六进制数字组成)来检查。
function ipv6ToInt(ip) {
const ipArray = ip.split(':');
// 确保每个段都是有效的十六进制数字
const isValidSegment = segment => /^[0-9A-F]{1,4}$/i.test(segment);
if (ipArray.length !== 8 || ipArray.some(segment => !isValidSegment(segment))) {
throw new Error('Invalid IPv6 address format');
}
return BigInt('0x' + ipArray.map(segment => parseInt(segment, 16).toString(16).padStart(4, '0')).join(''));
}
const ipv6Address = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
const ipv6Result = ipv6ToInt(ipv6Address);
console.log(ipv6Result.toString());
INT转IP
要将整数还原为IP地址,可以执行反向操作
function intToIp(intValue) {
const ipArray = [
(intValue >>> 24) & 255,
(intValue >>> 16) & 255,
(intValue >>> 8) & 255,
intValue & 255,
];
return ipArray.join('.');
}
// 示例
const intRepresentation = 3232235777; // 对应IP地址 192.168.1.1
const ipResult = intToIp(intRepresentation);
console.log(ipResult);
这段代码通过位运算将32位整数拆分为四个整数,然后将它们连接成一个IP地址字符串。代码中的无符号右移(>>>)的作用和右移运算符(>>)类似,但是它将操作数的左侧空出的位都填充为0,无论它是正数还是负数。
1010 >>> 2
-----------
10
位运算符在javaScript种比较低级的操作,通常用于处理二进制数据或优化特定的算法。在日常开发中,使用的频率相对较低,但对于一些特定的场景,如网络协议处理、加密算法等可能会非常有用。