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

String IP和Int IP的互相转换

android中,wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址,但这是一个int值,如何转换为常见的如192.168.1.129这种形式,以及这种形式如何转换回int值的形式。

这里ip分为4段,每一段的值都是0 ~ 255,这正好是1个无符号字节就能表示的,所以ip的值用4个字节就可以保存,4个字节刚好又和int的大小相同。

String IP 和Int IP的相互转换,答案来自ChatGPT:

在 Android 中,WifiManager.connectionInfo.ipAddress 返回的 IP 地址是一个整数值(int),以 小端序(little-endian) 的格式存储。这里要搞清楚小端序存储是怎样的,比如IP 192.168.1.129 这个ip,最前面的192是高位,后面的129是低位,ip占4个字节,保存到int中时,如果先保存ip的高位,叫大端存储,如果先保存ip的低位,叫小端存储。在把这四个字节存到int中时,是以192、168、1、129这样的顺序存到Int,还是以129、1、168、192的顺序存呢?说是用的小端,所以是先存129的,所以129保存在Int的第一个字节中,1保存在第二个字节中,168保存在第3个字节中,192保存在第四个字节中,了解这个原理后其实就自己就能解析了。

要将其转换为常见的 192.168.1.129 格式(点分十进制),以及将点分十进制格式转换回整数,可以参考以下实现:

从 int 转换为点分十进制(String)格式

  • 方法 1: 使用 InetAddress 工具类

    val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val ipAddress = wifiManager.connectionInfo.ipAddress
    val ipString = InetAddress.getByAddress(
        ByteBuffer.allocate(4).putInt(ipAddress).array().reversedArray()
    ).hostAddress
    println("IP Address: $ipString")
    
  • 方法 2: 手动转换

    val ipAddress = wifiManager.connectionInfo.ipAddress
    val ipString = "${ipAddress and 0xFF}.${(ipAddress shr 8) and 0xFF}.${(ipAddress shr 16) and 0xFF}.${(ipAddress shr 24) and 0xFF}"
    println("IP Address: $ipString")
    

从点分十进制格式(String)转换为 int

  • 方法 1: 使用 InetAddress 工具类
val ipString = "192.168.1.129" // 替换为你的IP地址
val ipBytes = InetAddress.getByName(ipString).address
val ipInt = ByteBuffer.wrap(ipBytes.reversedArray()).int
println("IP Integer: $ipInt")
  • 方法 2: 手动转换
val ipString = "192.168.1.129" // 替换为你的IP地址
val segments = ipString.split(".")
val ipInt = (segments[0].toInt() and 0xFF) or
            ((segments[1].toInt() and 0xFF) shl 8) or
            ((segments[2].toInt() and 0xFF) shl 16) or
            ((segments[3].toInt() and 0xFF) shl 24)
println("IP Integer: $ipInt")

小结

  • 转换为字符串格式: 使用 InetAddress 是更可靠的方式,但手动方式也适用于这种简单情况。

  • 转换回整数: 同样可以选择手动或通过 InetAddress 实现。

手动方法更直接,但 InetAddress 提供的工具方法更容易处理一些特殊情况(例如 IPv6)。


http://www.kler.cn/a/429011.html

相关文章:

  • 左神算法基础提升--4
  • 网络功能虚拟化(NFV):网络设备也能虚拟成产品
  • 【RAG落地利器】向量数据库Qdrant使用教程
  • 编程工具箱(免费,离线可用)
  • 二叉树总结(hot100)
  • [Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget
  • HTML旋转爱心(完整代码)
  • lanqiaoOJ 3744:小蓝的智慧拼图购物 ← pair+优先队列
  • Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二
  • Apache Solr 身份认证绕过漏洞复现(CVE-2024-45216)
  • MySQL系列之数据授权(安全)
  • 前端导出excel实战(xlsx库和exceljs库)
  • Leetcode 739-每日温度
  • Docker容器网络与通信
  • mysql备份数据库
  • 8.16DEBUG——DOCKER相关,DOCKER启动异常
  • Python-分析内存进制转换
  • HOC vs Render Props vs Hooks
  • 在Windows下C语言获取当前应用程序运行路径并获取指定目录下所有文件(包括子目录)
  • 决策树:ID3、C4.5和CART特征选择方式
  • Lua使用点号和冒号的区别
  • Selenium是广泛使用的模拟浏览器运行的库
  • 为超越JVM而生?深入理解Kotlin Native的梦想与可能
  • 使用PaddleOCR遇到的问题Bug
  • 机器学习:全面学习路径指南
  • 漫画之家Spring Boot:漫画资源的跨设备访问