我在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
}
我的问题:我怎么能与此完全相反?
答案 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 }