将IP地址转换为二进制(UInt32)

时间:2017-10-29 20:40:52

标签: ios swift

我在Stringformat中有一个IP地址,所以"192.168.0.1"

我想将此字符串转换为二进制/位版本,以便从中获取Uint32。在这种情况下16820416

我在网上找到了多个教程如何将位版本转换为字符串,如下所示:

let ipAddress = 16820416

public var ipAddressString: String {
    var bytes = [UInt32]()
    bytes.append(self.ipAddress & 0xFF)
    bytes.append((self.ipAddress >> 8) & 0xFF)
    bytes.append((self.ipAddress >> 16) & 0xFF)
    bytes.append((self.ipAddress >> 24) & 0xFF)

    return "\(bytes[0]).\(bytes[1]).\(bytes[2]).\(bytes[3])" //192.168.0.1
}

我的问题:我怎么能与此完全相反?

2 个答案:

答案 0 :(得分:3)

inet_pton()功能...

  

...转换演示文稿格式地址(即,可打印的表单,如        字符串)到网络格式(通常是结构in_addr或其他一些内部二进制表示,按网络字节顺序)。

示例:

let addrString = "192.168.0.1"
var addr = in_addr()
if inet_pton(AF_INET, addrString, &addr) == 1 {
    let ipAddress = addr.s_addr

    print(ipAddress) // 16820416
    print(String(format:"%#08x", ipAddress)) // 0x100a8c0
} else {
    print("invalid address")
}

所有套接字地址结构都使用“网络字节顺序”(= big-endian)。 如果你想要主机字节顺序的IP地址(= little-endian) 然后使用

    let ipAddress = UInt32(bigEndian: addr.s_addr)

    print(ipAddress) // 3232235521
    print(String(format:"%#08x", ipAddress)) // 0xc0a80001

答案 1 :(得分:1)

使用components(separatedBy:)将字符串分成4部分。然后将每个部分依次添加到总计中,每次将前一个总计移动8位:

let ipString = "192.168.1.12"
let values = ipString.components(separatedBy: ".").flatMap{Int($0)}

var result = 0
for aValue in values {
  result = result << 8 + aValue
}
print(String(format:"%X", result))

或者去&#34;全功能:&#34;

let ipString = "192.168.1.12"
let result = ipString.components(separatedBy: ".").flatMap{Int($0)}.reduce(0, 
{ x, y in
  x << 8 + y
})

尽可能简短而神秘:

let ipString = "192.168.1.12"
let result = ipString.components(separatedBy: ".").flatMap{Int($0)}.reduce(0) { $0 << 8 + $1 }