iOS项目的Swift Building IP 4地址类
我试图为IP地址创建自己的类。我想将其用于iOS项目。我想弄清楚我们要把代码放在0到255之间。分离器工作不正常。我想让它保存一个ip地址,比如192.168.0.1,如果我输入400.168.0.1,它应该返回一个错误,或者说请键入一个真实的ip地址,作为输出之一,指出有问题。我试图创建一个类,当您输入一个ip地址时,它应该保存在类本身中。我想稍后制作一个iOS应用程序,帮助人们了解如何为cisco路由器和交换机分配IP地址。基本上,我想制作一个应用程序,帮助人们使用CIDR ip地址符号,就像我在网上找到的这个网页程序一样,但如果没有互联网连接,我几乎无法使用。如果我能编程一个移动应用程序,可以做什么,这个网站将是伟大的我的工作线在网络iOS项目的Swift Building IP 4地址类,swift,string,parsing,int,ip-address,Swift,String,Parsing,Int,Ip Address,我试图为IP地址创建自己的类。我想将其用于iOS项目。我想弄清楚我们要把代码放在0到255之间。分离器工作不正常。我想让它保存一个ip地址,比如192.168.0.1,如果我输入400.168.0.1,它应该返回一个错误,或者说请键入一个真实的ip地址,作为输出之一,指出有问题。我试图创建一个类,当您输入一个ip地址时,它应该保存在类本身中。我想稍后制作一个iOS应用程序,帮助人们了解如何为cisco路由器和交换机分配IP地址。基本上,我想制作一个应用程序,帮助人们使用CIDR ip地址符号,就
import UIKit
class IP4 {
var ipA: Int?
var ipB: Int?
var ipC: Int?
var ipD: Int?
func fullIP() -> Int {
var parts: [Int] = []
if let ipA = self.ipA {
parts += [ipA]
}
if let ipB = self.ipB {
parts += [ipB]
}
if let ipC = self.ipC {
parts += [ipC]
}
if let ipD = self.ipD {
parts += [ipD]
}
return parts.joined(separator: ".")
}
}
let ipaddress = IP4()
ipaddress.ipA = 223
ipaddress.ipB = 9
ipaddress.ipC = 50
ipaddress.ipD = 60
这是一个例子,可以在操场上测试。(在Xcode 9.4.1上测试。) 要使用面具,请执行以下操作:
extension IPv4 {
init(maskOfLength len: Int) {
let highBits: [UInt8] = [
0b10000000,
0b11000000,
0b11100000,
0b11110000,
0b11111000,
0b11111100,
0b11111110,
0b11111111,
]
switch len {
case 0:
self = IPv4(0, 0, 0, 0)
case 1...8:
self = IPv4(highBits[len-1], 0, 0, 0)
case 9...16:
self = IPv4(0b11111111, highBits[len-9], 0, 0)
case 17...24:
self = IPv4(0b11111111, 0b11111111, highBits[len-17], 0)
case 25...32:
self = IPv4(0b11111111, 0b11111111, 0b11111111, highBits[len-25])
default:
fatalError()
}
}
func masked(by mask: IPv4) -> IPv4 {
return IPv4(self.ipA & mask.ipA, self.ipB & mask.ipB, self.ipC & mask.ipC, self.ipD & mask.ipD)
}
}
let mask = IPv4(maskOfLength: 24)
print(mask.binaryDescription) //->11111111.11111111.11111111.00000000
print(ip.masked(by: mask).binaryDescription) //->11011111.00001001.00110010.00000000
获取IP v4地址类的扩展
enum IPv4AddressClass {
case a
case b
case c
case d
case e
}
extension IPv4 {
var addressClass: IPv4AddressClass {
if ipA & 0b1_0000000 == 0b0_0000000 {
return .a
} else if ipA & 0b11_000000 == 0b10_000000 {
return .b
} else if ipA & 0b111_00000 == 0b110_00000 {
return .c
} else if ipA & 0b1111_0000 == 0b1110_0000 {
return .d
} else {
return .e
}
}
}
print(ip.addressClass) //->c
这是一个例子,可以在操场上测试。(在Xcode 9.4.1上测试。) 要使用面具,请执行以下操作:
extension IPv4 {
init(maskOfLength len: Int) {
let highBits: [UInt8] = [
0b10000000,
0b11000000,
0b11100000,
0b11110000,
0b11111000,
0b11111100,
0b11111110,
0b11111111,
]
switch len {
case 0:
self = IPv4(0, 0, 0, 0)
case 1...8:
self = IPv4(highBits[len-1], 0, 0, 0)
case 9...16:
self = IPv4(0b11111111, highBits[len-9], 0, 0)
case 17...24:
self = IPv4(0b11111111, 0b11111111, highBits[len-17], 0)
case 25...32:
self = IPv4(0b11111111, 0b11111111, 0b11111111, highBits[len-25])
default:
fatalError()
}
}
func masked(by mask: IPv4) -> IPv4 {
return IPv4(self.ipA & mask.ipA, self.ipB & mask.ipB, self.ipC & mask.ipC, self.ipD & mask.ipD)
}
}
let mask = IPv4(maskOfLength: 24)
print(mask.binaryDescription) //->11111111.11111111.11111111.00000000
print(ip.masked(by: mask).binaryDescription) //->11011111.00001001.00110010.00000000
获取IP v4地址类的扩展
enum IPv4AddressClass {
case a
case b
case c
case d
case e
}
extension IPv4 {
var addressClass: IPv4AddressClass {
if ipA & 0b1_0000000 == 0b0_0000000 {
return .a
} else if ipA & 0b11_000000 == 0b10_000000 {
return .b
} else if ipA & 0b111_00000 == 0b110_00000 {
return .c
} else if ipA & 0b1111_0000 == 0b1110_0000 {
return .d
} else {
return .e
}
}
}
print(ip.addressClass) //->c
提示:有时您必须将整数转换为字符串…为什么
ipA
-ipD
是可选的?根据规范要求,所有4个零件都是必需的。您希望得到什么类型的结果?字符串表示法?(正如您的“
所建议的那样。)网络顺序字节序列?(那么结果类型应该是有序的集合,如数据
或[UInt8]
)或主机顺序内部表示?(UInt32
在本例中是首选。)您试图生成的内容还不够清楚。我希望它保留一个类似192.168.0.1的ip地址,如果我输入400.168.0.1,它应该返回一个错误或说请键入一个真实的ip地址。如果您说只保留,则不需要使用fullIP()
方法。该方法的用途是什么?提示:在某些情况下,您必须将整数转换为字符串…为什么ipA
-ipD
是可选的?根据规范要求,所有4个零件都是必需的。您希望得到什么类型的结果?字符串表示法?(正如您的“
所建议的那样。)网络顺序字节序列?(那么结果类型应该是有序的集合,如数据
或[UInt8]
)或主机顺序内部表示?(UInt32
在本例中是首选。)您试图生成的内容还不够清楚。我希望它保留一个类似192.168.0.1的ip地址,如果我输入400.168.0.1,它应该返回一个错误或说请键入一个真实的ip地址。如果您说只保留,则不需要使用fullIP()
方法。这个方法的目的是什么?我很惊讶你能用swift编程。我考虑使用数据类型UInt8。我主要使用字符串和int。我以前从未真正使用过这些其他类型的数据类型。当您使用网络或特定于硬件的功能(例如蓝牙设备)时,您可能需要它。我希望我的代码能帮助你制作出优秀的应用程序。请记住,展示你自己的代码会对写答案有很大帮助,但是如果你对你真正想做的事情没有足够的解释,代码可能会误导读者。你的代码看起来像是ip地址的A类、B类、C类、D类、E类或更大范围。也许最好在if条件下执行此操作,而不是在案例中。我相信有人会发现你的箱子开关很有用。在为Cisco路由器和交换机开发ip地址分配应用程序时。添加了另一个扩展以获取地址类。事实上,人们通常使用32位数据类型(UInt32
在Swift中)来表示ipv4地址,当需要每个八位字节时,他们将其分成4个八位字节。32位数据(以及4位八位组数据)可以表示包括E类在内的整个IP v4地址。我查找了unint4,swift的框架中确实有这种数据类型。我可能会按照你的建议使用4位数据类型和UInt32数据类型来保存ip地址位。我很惊讶你能用swift编程。我考虑使用数据类型UInt8。我主要使用字符串和int。我以前从未真正使用过这些其他类型的数据类型。当您使用网络或特定于硬件的功能(例如蓝牙设备)时,您可能需要它。我希望我的代码能帮助你制作出优秀的应用程序。请记住,展示你自己的代码会对写答案有很大帮助,但是如果你对你真正想做的事情没有足够的解释,代码可能会误导读者。你的代码看起来像是ip地址的A类、B类、C类、D类、E类或更大范围。也许最好在if条件下执行此操作,而不是在案例中。我相信有人会发现你的箱子开关很有用。在为Cisco路由器和交换机开发ip地址分配应用程序时。添加了另一个扩展以获取地址类。事实上,人们通常使用32位数据类型(UInt32
在Swift中)来表示ipv4地址,当需要每个八位字节时,他们将其分成4个八位字节。32位数据(以及4位八位组数据)可以表示包括E类在内的整个IP v4地址。我查找了unint4,swift的框架中确实有这种数据类型。我可能会按照您的建议使用4位数据类型和UInt32数据类型来保存ip地址位。