尋求將IPv6字符串(例如2001:0:4137:9e76:34b7:2e31:3f57:fd9a)轉換爲BigInteger以及從BigInteger轉換爲IPv6字符串。如何將IPv6地址轉換爲Scala中的BigInteger以及如何轉換BigInteger中的IPv6地址
1
A
回答
4
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
UPDATE編輯:
每一個建議編輯來自匿名用戶:
「的評論:InetAddress.getByAddress需要一個16字節的數組,以解析的IPv6地址(4字節。數組的IPv4),因爲它是,代碼失敗未造成一個16字節數組的任意值時.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("/", "")
}
1
看看這個(支持IPv4和IPv6):
import java.math.BigInteger
import java.net.{UnknownHostException, InetAddress}
import org.apache.commons.lang.StringUtils
def ipToBigInteger(s: String): BigInteger = {
try {
val i = InetAddress.getByName(s)
val a: Array[Byte] = i.getAddress()
new BigInteger(1, a)
} catch {
case e: UnknownHostException => new BigInteger("-1")
}
}
def bigIntegerToIP(s: String): String = {
try {
//InetAddress.getByAddress(bi.toByteArray).toString.replaceFirst("/", "")
val bi = new BigInteger(s)
if (bi.compareTo(new BigInteger("0")) != -1 && bi.compareTo(new BigInteger("340282366920938463463374607431768211455")) != 1) {
if (bi.compareTo(new BigInteger("4294967295")) != 1) { // IPV4
val l = bi.longValue
String.format("%d.%d.%d.%d",
bi.shiftRight(24).and(BigInteger.valueOf(0xFF)).intValue: Integer,
bi.shiftRight(16).and(BigInteger.valueOf(0xFF)).intValue: Integer,
bi.shiftRight(8).and(BigInteger.valueOf(0xFF)).intValue: Integer,
bi.and(BigInteger.valueOf(0xFF)).intValue: Integer)
} else { // IPV6
String.format("%s:%s:%s:%s:%s:%s:%s:%s",
Integer.toHexString(bi.shiftRight(112).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(96).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(80).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(64).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(48).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(32).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(16).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String)
}
} else
StringUtils.EMPTY
} catch {
case e: UnknownHostException => StringUtils.EMPTY
case e: NumberFormatException => StringUtils.EMPTY
}
}
def bigIntegerToIPV6(bi: BigInteger): String = {
try {
//InetAddress.getByAddress(bi.toByteArray).toString.replaceFirst("/", "")
if (bi.compareTo(new BigInteger("0")) != -1 && bi.compareTo(new BigInteger("340282366920938463463374607431768211455")) != 1) {
String.format("%s:%s:%s:%s:%s:%s:%s:%s",
Integer.toHexString(bi.shiftRight(112).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(96).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(80).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(64).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(48).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(32).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.shiftRight(16).and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String,
Integer.toHexString(bi.and(BigInteger.valueOf(0xFFFF)).intValue): java.lang.String)
} else
StringUtils.EMPTY
} catch {
case e: UnknownHostException => StringUtils.EMPTY
case e: NumberFormatException => StringUtils.EMPTY
}
}
相關問題
- 1. 如何將IPV6地址轉換爲IPV4地址?
- 2. Ruby:如何將ipv6的uo地址轉換爲ipv4的ip地址?
- 3. 如何將地址從IPv4轉換爲IPv6
- 4. 如何將ipv4地址轉換爲ipv6使用AFNetworking?
- 5. gethostbyname替換爲IPv6地址
- 6. 將域名轉換爲Perl中的IPv6地址
- 7. 在Python中將IPv4地址轉換爲十六進制IPv6地址
- 8. 在PHP中將IPv6轉換爲IPv4地址
- 9. 將壓縮的IPv6地址轉換爲長格式的代碼
- 10. .NET IPAddress類正在將IPv6轉換爲映射的IP地址
- 11. 如何IPV6地址在SQL
- 12. 如何將elf中的地址轉換爲物理地址
- 13. Perl的轉換龍IPv6地址以精簡的符號
- 14. c:在編譯時將ipv6地址轉換爲字符串
- 15. 將IPv4或IPv6地址轉換爲長字來進行比較
- 16. 如何將BigInteger轉換爲字符串?
- 17. 如何將字符串轉換爲BigInteger?
- 18. 如何將公鑰轉換爲BigInteger
- 19. 如何將Biginteger轉換爲字符串
- 20. 在perl的MAC地址到IPv6鏈接本地地址在線轉換
- 21. 轉換的IPv6地址類型爲網絡字節順序
- 22. 將IPv6轉換爲長和長的IPv6
- 23. 如何將MAC地址轉換爲相應的IP地址?
- 24. 將BigInteger轉換爲密鑰
- 25. 如何將IP地址轉換爲DWORD?
- 26. 如何將IP地址轉換爲MAC地址字節數組?
- 27. 如何將這些邏輯地址轉換爲物理地址?
- 28. 如何將此邏輯地址轉換爲物理地址?
- 29. 代表IPv6地址
- 30. sockaddr和IPv6地址