该文介绍了一个使用 Go 语言编写的 IP 分解小工具,支持多种 IP 地址格式,包括 xxx.xxx.xxx.xxxxxx.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.xxxxxx.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.xxxxxx.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.xxxxxx.xxx.xxx.xxx/xx、xxx.xxx.xxx.xxx-xxx、xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx 等格式。

用户可以根据自己的需求自行修改代码中的参数,以实现更灵活的 IP 分解功能。