如何在 Scala 中将 IPv6 地址与 BigInteger 相互转换

Gar*_*n S 2 scala biginteger ipv6 inetaddress

希望将 IPv6 字符串(例如 2001:0:4137:9e76:34b7:2e31:3f57:fd9a)转换为 BigInteger,并从 BigInteger 转换为 IPv6 字符串。

Gar*_*n S 5

import java.math.BigInteger
import java.net.InetAddress
import java.net.Inet6Address
def ipv6ToBigInteger(ipv6 : String) : BigInteger = {
    val ia = InetAddress.getByName(ipv6)
    val byteArr : Array[Byte] = ia.getAddress()
    var ipNumber = new BigInteger("0")
    if (ia.isInstanceOf[Inet6Address]) {
        ipNumber = new BigInteger(1, byteArr)
    }
    return ipNumber
}

def bigIntegerToIPv6(ipv6Num : BigInteger) : String = {
    val ipv6Str = InetAddress.getByAddress(ipv6Num.toByteArray).toString()
    return ipv6Str.replaceFirst("/", "")
}

val ipv6 = "2001:0:4137:9e76:34b7:2e31:3f57:fd9a"
val ipv6Num = ipv6ToBigInteger(ipv6) // ipv6Num: java.math.BigInteger = 42540488182159607633435240198452018586
val ipv6Str = bigIntegerToIPv6(ipv6Num) // ipv6Str: String = 2001:0:4137:9e76:34b7:2e31:3f57:fd9a
ipv6 == ipv6Str // res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)

更新编辑:

根据匿名用户的建议编辑:

“评论:InetAddress.getByAddress 需要一个 16 字节的数组来解析 IPv6 地址(IPv4 的 4 字节数组)。事实上,代码失败的任何值,当 .对它调用了 toByteArray”

def bigIntToFixedSizeByteArray(n: BigInteger, size: Int = 16): Array[Byte] = {
    val a = n.toByteArray
    val leadingLength = math.max(size - a.length, 0)
    Array.ofDim[Byte](leadingLength) ++ a
}

def bigIntegerToIPv6(ipv6Num : BigInteger) : String = {
    val address = InetAddress.getByAddress(bigIntToFixedSizeByteArray(ipv6Num))  
    address.toString.replaceFirst("/", "")
}
Run Code Online (Sandbox Code Playgroud)