IP与数字的互相转化

339 阅读2分钟

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种比较低级的操作,通常用于处理二进制数据或优化特定的算法。在日常开发中,使用的频率相对较低,但对于一些特定的场景,如网络协议处理、加密算法等可能会非常有用。