开发者工具箱-鸿蒙IPv6子网计算器开发笔记
2025-06-04 13:13:56
194次阅读
0个评论
鸿蒙IPv6子网计算器开发笔记
基础知识
先来唠唠IPv6是啥玩意:
- 
  IPv6地址长啥样 - 8组16位的十六进制数
- 用冒号分开
- 比如 2001:0db8:0000:0000:0000:0000:0000:0001
- 可以简写成 2001:db8::1
 
- 
  IPv6地址类型 - 全局单播地址:公网用的
- 链路本地地址:局域网用的
- 唯一本地地址:私网用的
- 多播地址:一对多通信
- 环回地址:本地测试用
 
- 
  地址压缩规则 - 每组前面的0可以省略
- 连续的0可以用::代替
- 但::只能用一次
- 比如 2001:0db8:0000:0000:0000:0000:0000:0001
- 可以写成 2001:db8::1
 
- 
  子网前缀 - 用/后面的数字表示
- 范围是0-128
- 比如 /64 表示前64位是网络号
- 后64位是主机号
 
- 
  IPv6地址结构 - 前48位:全球路由前缀
- 中间16位:子网ID
- 后64位:接口ID
- 比如 2001:db8:1234:5678::1
- 2001:db8 是前缀
- 1234 是子网
- 5678::1 是接口
 
- 
  特殊地址 - ::/128:未指定地址
- ::1/128:环回地址
- fe80::/10:链路本地
- ff00::/8:多播地址
- 2000::/3:全局单播
 
- 
  地址分配 - 2000::/3:公网地址
- fc00::/7:私网地址
- fe80::/10:本地链路
- ff00::/8:多播地址
 
- 
  子网划分 - /64:标准子网
- /48:大型网络
- /56:中型网络
- /64:小型网络
- /128:单机地址
 
- 
  地址配置 - 手动配置
- DHCPv6
- SLAAC(无状态)
- 双栈模式
 
- 
  常见问题 - 地址太长不好记
- 配置比较复杂
- 需要双栈支持
- 工具支持不够
 
前言
最近在搞鸿蒙开发者工具箱,想着加个IPv6子网计算器。这玩意比IPv4复杂多了,光是地址格式就够喝一壶的。不过好在最后搞定了,现在可以算IPv6的子网信息了。
一、功能说明
1.1 主要功能
- 算网络地址
- 算可用主机数
- 算首尾可用地址
- 支持地址压缩
- 支持地址展开
- 支持多种地址类型
1.2 界面功能
- IPv6地址输入框
- 一键复制结果
- 显示详细计算
- 支持收藏
- 有使用说明
二、实现过程
2.1 计算原理
IPv6子网计算主要是位运算:
- 
  网络地址计算 - IP地址和子网掩码做与运算
- 比如 2001:db8::1/64
- 网络地址就是 2001:db8::
 
- 
  可用主机数计算 - 2^(128-前缀长度) - 2
- 比如 /64 就是 2^64 - 2
- 这个数太大了,用字符串表示
 
- 
  首尾地址计算 - 首地址:网络地址+1
- 尾地址:广播地址-1
- 比如 2001:db8::1 到 2001:db8::ffff
 
2.2 代码实现
// IPv6工具类
class IPv6UtilsClass {
  // 展开IPv6地址
  expandIPv6(ip: string): string {
    // 处理双冒号
    if (ip.includes('::')) {
      const parts = ip.split('::');
      const left = parts[0].split(':').filter(p => p);
      const right = parts[1].split(':').filter(p => p);
      const missing = 8 - left.length - right.length;
      const expanded = left.concat(Array(missing).fill('0000'), right);
      return expanded.map(p => p.padStart(4, '0')).join(':');
    }
    return ip.split(':').map(p => p.padStart(4, '0')).join(':');
  }
  // 压缩IPv6地址
  compressIPv6(ip: string): string {
    const parts = ip.split(':').map(p => p.replace(/^0+/, '') || '0');
    // 找最长的连续0
    let maxZeroStart = -1;
    let maxZeroLength = 0;
    let currentZeroStart = -1;
    let currentZeroLength = 0;
    for (let i = 0; i < parts.length; i++) {
      if (parts[i] === '0') {
        if (currentZeroStart === -1) {
          currentZeroStart = i;
        }
        currentZeroLength++;
      } else {
        if (currentZeroLength > maxZeroLength) {
          maxZeroLength = currentZeroLength;
          maxZeroStart = currentZeroStart;
        }
        currentZeroStart = -1;
        currentZeroLength = 0;
      }
    }
    if (maxZeroLength > 1) {
      const before = parts.slice(0, maxZeroStart);
      const after = parts.slice(maxZeroStart + maxZeroLength);
      return [...before, '', ...after].join(':');
    }
    return parts.join(':');
  }
  // 计算网络地址
  calculateNetworkAddress(ip: string, prefix: number): string {
    const binary = this.ipv6ToBinary(ip);
    const networkBinary = binary.map((bit, index) => index < prefix ? bit : 0);
    return this.binaryToIPv6(networkBinary);
  }
  // 计算可用主机数
  calculateHostCount(prefix: number): string {
    const hostBits = 128 - prefix;
    if (hostBits > 64) {
      return `2^${hostBits}`;
    }
    const count = BigInt(2) ** BigInt(hostBits) - BigInt(2);
    return count.toString();
  }
}
三、踩坑记录
3.1 遇到的问题
- 
  地址格式验证 - 问题:IPv6地址格式太复杂
- 解决:写了个超长的正则表达式
 
- 
  大数计算 - 问题:2^64 这种数太大了
- 解决:用 BigInt 和字符串
 
- 
  地址压缩 - 问题:压缩规则太复杂
- 解决:写了个专门的压缩函数
 
- 
  性能问题 - 问题:计算太慢
- 解决:优化了算法
 
3.2 优化建议
- 
  功能优化 - 支持更多格式
- 加个计算历史
- 支持批量计算
 
- 
  性能优化 - 优化计算速度
- 减少内存占用
- 及时释放资源
 
- 
  用户体验 - 加个计算历史
- 支持分享结果
- 优化动画效果
 
- 
  安全性 - 验证输入格式
- 限制计算频率
- 保护用户隐私
 
四、总结
这个IPv6子网计算器基本功能都有了,可以:
- 计算子网信息
- 规划网络地址
- 排查网络问题
- 学习网络知识
五、参考资料
欢迎体验
这个IPv6子网计算器已经集成到鸿蒙开发者工具箱里了,欢迎下载体验!
作者:在人间耕耘 邮箱:1743914721@qq.com 版权声明:本文为原创文章
00
- 0回答
- 0粉丝
- 0关注
