如何在Scala中将IPv4地址转换为Long或从Long转换

Gar*_*n S 4 ip scala ip-address ipv4

我正在寻找一个具有2个函数的基本实用程序,用于在Scala中将IPv4地址转换为Long,例如将"10.10.10.10"转换为168430090的Long表示并返回.诸如此类的基本实用程序存在于许多语言(例如python)中,但似乎需要为JVM的每个人重写相同的代码.

统一IPv4ToLong和LongToIPv4功能的推荐方法是什么?

小智 6

结合leifbattermanElesin Olalekan Fuad的想法,避免乘法和动力操作:

def ipv4ToLong(ip: String): Option[Long] = Try(
  ip.split('.').ensuring(_.length == 4)
    .map(_.toLong).ensuring(_.forall(x => x >= 0 && x < 256))
    .reverse.zip(List(0,8,16,24)).map(xi => xi._1 << xi._2).sum
).toOption
Run Code Online (Sandbox Code Playgroud)

要以点分格式将Long转换为String:

def longToipv4(ip: Long): Option[String] = if ( ip >= 0 && ip <= 4294967295L) {
  Some(List(0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000).zip(List(0,8,16,24))
    .map(mi => ((mi._1 & ip) >> mi._2)).reverse
    .map(_.toString).mkString("."))
} else None
Run Code Online (Sandbox Code Playgroud)