当前位置: 首页 > java >正文

开发者工具箱-鸿蒙IPv6子网计算器开发笔记

鸿蒙IPv6子网计算器开发笔记

基础知识

先来唠唠IPv6是啥玩意:

  1. IPv6地址长啥样

    • 8组16位的十六进制数
    • 用冒号分开
    • 比如 2001:0db8:0000:0000:0000:0000:0000:0001
    • 可以简写成 2001:db8::1
  2. IPv6地址类型

    • 全局单播地址:公网用的
    • 链路本地地址:局域网用的
    • 唯一本地地址:私网用的
    • 多播地址:一对多通信
    • 环回地址:本地测试用
  3. 地址压缩规则

    • 每组前面的0可以省略
    • 连续的0可以用::代替
    • 但::只能用一次
    • 比如 2001:0db8:0000:0000:0000:0000:0000:0001
    • 可以写成 2001:db8::1
  4. 子网前缀

    • 用/后面的数字表示
    • 范围是0-128
    • 比如 /64 表示前64位是网络号
    • 后64位是主机号
  5. IPv6地址结构

    • 前48位:全球路由前缀
    • 中间16位:子网ID
    • 后64位:接口ID
    • 比如 2001:db8🔢5678::1
    • 2001:db8 是前缀
    • 1234 是子网
    • 5678::1 是接口
  6. 特殊地址

    • ::/128:未指定地址
    • ::1/128:环回地址
    • fe80::/10:链路本地
    • ff00::/8:多播地址
    • 2000::/3:全局单播
  7. 地址分配

    • 2000::/3:公网地址
    • fc00::/7:私网地址
    • fe80::/10:本地链路
    • ff00::/8:多播地址
  8. 子网划分

    • /64:标准子网
    • /48:大型网络
    • /56:中型网络
    • /64:小型网络
    • /128:单机地址
  9. 地址配置

    • 手动配置
    • DHCPv6
    • SLAAC(无状态)
    • 双栈模式
  10. 常见问题

    • 地址太长不好记
    • 配置比较复杂
    • 需要双栈支持
    • 工具支持不够

前言

最近在搞鸿蒙开发者工具箱,想着加个IPv6子网计算器。这玩意比IPv4复杂多了,光是地址格式就够喝一壶的。不过好在最后搞定了,现在可以算IPv6的子网信息了。

一、功能说明

1.1 主要功能

  • 算网络地址
  • 算可用主机数
  • 算首尾可用地址
  • 支持地址压缩
  • 支持地址展开
  • 支持多种地址类型

1.2 界面功能

  • IPv6地址输入框
  • 一键复制结果
  • 显示详细计算
  • 支持收藏
  • 有使用说明

二、实现过程

2.1 计算原理

IPv6子网计算主要是位运算:

  1. 网络地址计算

    • IP地址和子网掩码做与运算
    • 比如 2001:db8::1/64
    • 网络地址就是 2001:db8::
  2. 可用主机数计算

    • 2^(128-前缀长度) - 2
    • 比如 /64 就是 2^64 - 2
    • 这个数太大了,用字符串表示
  3. 首尾地址计算

    • 首地址:网络地址+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');// 找最长的连续0let 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 遇到的问题

  1. 地址格式验证

    • 问题:IPv6地址格式太复杂
    • 解决:写了个超长的正则表达式
  2. 大数计算

    • 问题:2^64 这种数太大了
    • 解决:用 BigInt 和字符串
  3. 地址压缩

    • 问题:压缩规则太复杂
    • 解决:写了个专门的压缩函数
  4. 性能问题

    • 问题:计算太慢
    • 解决:优化了算法

3.2 优化建议

  1. 功能优化

    • 支持更多格式
    • 加个计算历史
    • 支持批量计算
  2. 性能优化

    • 优化计算速度
    • 减少内存占用
    • 及时释放资源
  3. 用户体验

    • 加个计算历史
    • 支持分享结果
    • 优化动画效果
  4. 安全性

    • 验证输入格式
    • 限制计算频率
    • 保护用户隐私

四、总结

这个IPv6子网计算器基本功能都有了,可以:

  • 计算子网信息
  • 规划网络地址
  • 排查网络问题
  • 学习网络知识

五、参考资料

  • 鸿蒙应用开发指南

欢迎体验

这个IPv6子网计算器已经集成到鸿蒙开发者工具箱里了,欢迎下载体验!

鸿蒙开发者工具箱


作者:在人间耕耘
邮箱:1743914721@qq.com
版权声明:本文为原创文章

http://www.xdnf.cn/news/8596.html

相关文章:

  • .NET外挂系列:8. harmony 的IL编织 Transpiler
  • 如何通过EventChannel实现Flutter与原生平台的双向通信?
  • C++ 输入输出流示例代码剖析
  • 每日c/c++题 备战蓝桥杯(洛谷P1873 EKO砍树问题详解)
  • 几个MySQL系统调优工具
  • 黑马点评--基于Redis实现共享session登录
  • 《关于浔川社团退出DevPress社区及内容撤回的声明》
  • [C++面试] 基础题 11~20
  • 怎样改变中断优先级?
  • 酷柚易汛ERP仓储物流解决方案
  • CodeBuddy实现pdf批量加密
  • SQL注入基础
  • vue+threeJs 创造镂空管状
  • 配置tomcat时,无法部署工件该怎么办?
  • 深度学习损失“三位一体”——从 Fisher 的最大似然到 Shannon 的交叉熵再到 KL 散度,并走进 PET·P-Tuning微调·知识蒸馏的实战
  • Selenium自动化测试网页加载太慢如何解决?
  • 基于netty实现视频流式传输和多线程传输
  • 大模型的上下文context到底是啥
  • 环境搭建与工具配置
  • 博客打卡-八皇后问题
  • 用go从零构建写一个RPC(3)--异步调用+多路复用实现
  • 分布式事务知识点整理
  • ubuntu ollama /Dify/Docker部署大模型
  • 在单片机中如何在断电前将数据保存至DataFlash?
  • [docker]更新容器中镜像版本
  • Reason-ModernColBERT论文速览:Sentence- bert-基于孪生bert网络的句子嵌入
  • 【Web前端】jQuery入门与基础(一)
  • 【GESP】C++三级真题 luogu-B4039 [GESP202409 三级] 回文拼接
  • Python中tqdm进度条工具和enumerate函数的使用详解
  • 关于读取CH584单片机的IO电平出现到的乌龙