mirror of
				https://github.com/oneclickvirt/backtrace.git
				synced 2025-11-04 15:52:37 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			967 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			967 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package backtrace
 | 
						|
 | 
						|
import (
 | 
						|
	"net"
 | 
						|
)
 | 
						|
 | 
						|
// GeneratePrefixList 生成指定前缀的IP地址列表
 | 
						|
func GeneratePrefixList(prefix string) []string {
 | 
						|
	// 解析CIDR表示法的IP地址
 | 
						|
	_, ipNet, err := net.ParseCIDR(prefix)
 | 
						|
	if err != nil {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
	// 获取IP地址的32位整数表示
 | 
						|
	ip := ipNet.IP.To4()
 | 
						|
	start := binaryIPToInt(ip)
 | 
						|
	maskSize, _ := ipNet.Mask.Size()
 | 
						|
	end := start | (1<<(32-maskSize) - 1)
 | 
						|
	// 生成IP地址列表
 | 
						|
	var prefixList []string
 | 
						|
	for i := start; i <= end; i++ {
 | 
						|
		if (i-start)%256 == 0 {
 | 
						|
			tempText := intToBinaryIP(i).String()
 | 
						|
			prefixList = append(prefixList, tempText[:len(tempText)-2])
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return prefixList
 | 
						|
}
 | 
						|
 | 
						|
// 将IP地址转换为32位整数
 | 
						|
func binaryIPToInt(ip net.IP) uint32 {
 | 
						|
	return (uint32(ip[0]) << 24) | (uint32(ip[1]) << 16) | (uint32(ip[2]) << 8) | uint32(ip[3])
 | 
						|
}
 | 
						|
 | 
						|
// 将32位整数转换为IP地址
 | 
						|
func intToBinaryIP(i uint32) net.IP {
 | 
						|
	return net.IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i))
 | 
						|
}
 |