该文介绍了一个使用 Go 语言编写的 IP 分解小工具,支持多种 IP 地址格式,包括 xxx.xxx.xxx.xxx、xxx.xxx.xxx.xxx/xx、xxx.xxx.xxx.xxx-xxx、xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx 等格式。用户可以根据自己的需求自行修改代码中的参数,以实现更灵活的 IP 分解功能。该工具使用了 Go 语言的标准库 net 包中的 IP 地址相关函数。如果用户对 IP 分解小工具有任何疑问或建议,可以在评论中留言。
以下是 Go 语言编写的 IP 分解小工具的示例代码:
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
ips := getInputIPs()
if len(ips) == 0 {
fmt.Println("没有找到 IP 地址,请输入要扫描的 IP 地址!")
return
}
outputFileName := getOutputFileName()
outputFile, err := os.Create(outputFileName)
if err != nil {
fmt.Println("无法创建输出文件!")
return
}
defer outputFile.Close()
for _, ip := range ips {
ipsList, err := generateIPs(ip)
if err != nil {
fmt.Println(err)
continue
}
for _, ip := range ipsList {
outputFile.WriteString(ip + "\\\\n")
fmt.Println(ip)
}
}
fmt.Println("分解完成!结果已写入文件:", outputFileName)
}
func getInputIPs() []string {
var ips []string
if len(os.Args) > 1 {
ipStr := os.Args[1]
if strings.Contains(ipStr, ".") {
ips = append(ips, ipStr)
} else {
file, err := os.Open(ipStr)
if err != nil {
fmt.Println("无法打开文件:", ipStr)
return ips
}
defer file.Close()
buf := make([]byte, 1024)
for {
n, _ := file.Read(buf)
if n == 0 {
break
}
ipsStr := strings.TrimSpace(string(buf[:n]))
ipArr := strings.Split(ipsStr, "\\\\n")
for _, ip := range ipArr {
if strings.Contains(ip, ".") {
ips = append(ips, ip)
}
}
}
}
}
return ips
}
func generateIPs(ip string) ([]string, error) {
var ips []string
if strings.Contains(ip, "-") {
ipArr := strings.Split(ip, "-")
if len(ipArr) != 2 {
return ips, fmt.Errorf("无效的 IP 范围:%s", ip)
}
startIP := net.ParseIP(strings.TrimSpace(ipArr[0]))
if startIP == nil {
return ips, fmt.Errorf("无效的起始 IP 地址:%s", ipArr[0])
}
endIP := net.ParseIP(strings.TrimSpace(ipArr[1]))
if endIP == nil {
return ips, fmt.Errorf("无效的结束 IP 地址:%s", ipArr[1])
}
for ip := startIP; ip.String() <= endIP.String(); incIP(ip) {
ips = append(ips, ip.String())
}
} else if strings.Contains(ip, "/") {
ipArr := strings.Split(ip, "/")
if len(ipArr) != 2 {
return ips, fmt.Errorf("无效的 IP 网段:%s", ip)
}
IP, ipNet, err := net.ParseCIDR(ip)
if err != nil {
return ips, fmt.Errorf("无效的 IP 网段:%s", ip)
}
for ip := IP.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) {
ips = append(ips, ip.String())
}
} else {
IP := net.ParseIP(ip)
if IP == nil {
return ips, fmt.Errorf("无效的 IP 地址:%s", ip)
}
ips = append(ips, IP.String())
}
return ips, nil
}
func incIP(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}
func getOutputFileName() string {
outputFileName := "output.txt"
if len(os.Args) > 2 {
outputFileName = os.Args[2]
}
return outputFileName
}
以上示例代码可以在终端中执行并输入需要分解的 IP 地址,程序将返回分解后的结果。用户也可以通过输入文件路径来读取文件中的 IP 地址进行分解。用户可以自定义输出文件的名称和格式,如果没有自定义输出文件名,则默认输出文件名为 output.txt。输出文件为文本格式。
该工具使用了 Go 语言的标准库 net 包中的 IP 地址相关函数,支持多种 IP 地址格式,包括 xxx.xxx.xxx.xxx、xxx.xxx.xxx.xxx/xx、xxx.xxx.xxx.xxx-xxx、xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx 等格式。
用户可以根据自己的需求自行修改代码中的参数,以实现更灵活的 IP 分解功能。
以上示例代码可以在终端中执行并输入需要分解的 IP 地址,程序将返回分解后的结果。用户也可以通过输入文件路径来读取文件中的 IP 地址进行分解。用户可以自定义输出文件的名称和格式,如果没有自定义输出文件名,则默认输出文件名为 output.txt。输出文件为文本格式。
该工具使用了 Go 语言的标准库 net 包中的 IP 地址相关函数,支持多种 IP 地址格式,包括 xxx.xxx.xxx.xxx、xxx.xxx.xxx.xxx/xx、xxx.xxx.xxx.xxx-xxx、xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx 等格式。
用户可以根据自己的需求自行修改代码中的参数,以实现更灵活的 IP 分解功能。
如果用户对 IP 分解小工具有任何疑问或建议,可以在评论中留言,我们会尽快回复和处理。谢谢!
以下是 Go 语言编写的 IP 分解小工具的示例代码:
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
ips := getInputIPs()
if len(ips) == 0 {
fmt.Println("没有找到 IP 地址,请输入要扫描的 IP 地址!")
return
}
outputFileName := getOutputFileName()
outputFile, err := os.Create(outputFileName)
if err != nil {
fmt.Println("无法创建输出文件!")
return
}
defer outputFile.Close()
for _, ip := range ips {
ipsList, err := generateIPs(ip)
if err != nil {
fmt.Println(err)
continue
}
for _, ip := range ipsList {
outputFile.WriteString(ip + "\\\\n")
fmt.Println(ip)
}
}
fmt.Println("分解完成!结果已写入文件:", outputFileName)
}
func getInputIPs() []string {
var ips []string
if len(os.Args) > 1 {
ipStr := os.Args[1]
if strings.Contains(ipStr, ".") {
ips = append(ips, ipStr)
} else {
file, err := os.Open(ipStr)
if err != nil {
fmt.Println("无法打开文件:", ipStr)
return ips
}
defer file.Close()
buf := make([]byte, 1024)
for {
n, _ := file.Read(buf)
if n == 0 {
break
}
ipsStr := strings.TrimSpace(string(buf[:n]))
ipArr := strings.Split(ipsStr, "\\\\n")
for _, ip := range ipArr {
if strings.Contains(ip, ".") {
ips = append(ips, ip)
}
}
}
}
}
return ips
}
func generateIPs(ip string) ([]string, error) {
var ips []string
if strings.Contains(ip, "-") {
ipArr := strings.Split(ip, "-")
if len(ipArr) != 2 {
return ips, fmt.Errorf("无效的 IP 范围:%s", ip)
}
startIP := net.ParseIP(strings.TrimSpace(ipArr[0]))
if startIP == nil {
return ips, fmt.Errorf("无效的起始 IP 地址:%s", ipArr[0])
}
endIP := net.ParseIP(strings.TrimSpace(ipArr[1]))
if endIP == nil {
return ips, fmt.Errorf("无效的结束 IP 地址:%s", ipArr[1])
}
for ip := startIP; ip.String() <= endIP.String(); incIP(ip) {
ips = append(ips, ip.String())
}
} else if strings.Contains(ip, "/") {
ipArr := strings.Split(ip, "/")
if len(ipArr) != 2 {
return ips, fmt.Errorf("无效的 IP 网段:%s", ip)
}
IP, ipNet, err := net.ParseCIDR(ip)
if err != nil {
return ips, fmt.Errorf("无效的 IP 网段:%s", ip)
}
for ip := IP.Mask(ipNet.Mask); ipNet.Contains(ip); incIP(ip) {
ips = append(ips, ip.String())
}
} else {
IP := net.ParseIP(ip)
if IP == nil {
return ips, fmt.Errorf("无效的 IP 地址:%s", ip)
}
ips = append(ips, IP.String())
}
return ips, nil
}
func incIP(ip net.IP) {
for j := len(ip) - 1; j >= 0; j-- {
ip[j]++
if ip[j] > 0 {
break
}
}
}
func getOutputFileName() string {
outputFileName := "output.txt"
if len(os.Args) > 2 {
outputFileName = os.Args[2]
}
return outputFileName
}
以上示例代码可以在终端中执行并输入需要分解的 IP 地址,程序将返回分解后的结果。用户也可以通过输入文件路径来读取文件中的 IP 地址进行分解。用户可以自定义输出文件的名称和格式,如果没有自定义输出文件名,则默认输出文件名为 output.txt。输出文件为文本格式。
该工具使用了 Go 语言的标准库 net 包中的 IP 地址相关函数,支持多种 IP 地址格式,包括 xxx.xxx.xxx.xxx、xxx.xxx.xxx.xxx/xx、xxx.xxx.xxx.xxx-xxx、xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx 等格式。
用户可以根据自己的需求自行修改代码中的参数,以实现更灵活的 IP 分解功能。