2016-06-09 7 views
0

Hallo Ich versuche, die Binärdatei in Golang zu invertieren, um Broadcast-IP-Adresse aus den Eingabedaten zu finden.Go/GoLang invertierte binäre Daten zu finden Boardcast Adresse

10000010.00101101.00100000.00000000 (network adress) 
OR 
00000000.00000000.00001111.11111111 (inverted subnet mask) 
= 
10000010.00101101.00101111.11111111 = 130.45.47.255 (broadcast address) 

Eingang Benutzer Angenommen

network address 130.45.32.0 
subnetmask  255.255.240.0 11111111.11111111.11110000.00000000 
// expect invert subnetmask  00000000.00000000.00001111.11111111 

Also, wenn ich Subnetz-Maske jetzt von Benutzereingaben bekam ich brauche es zu invertieren

// subIp from https://golang.org/pkg/net/#IP.Mask 
subIp:=subnetmask.Mask(network.Mask) 
//     255.  255.  240.  0 
// then I loop to subIp[0], subIp[1], subIp[2], subIp[3]  
// I Assume subIp[3] = 0 
subnet := int64(subIp[3]) 
subnetString := strconv.FormatInt(subnet, 2) 

// add 0 before number 
subnetString = leftPad2Len(subnetString, "0", 8) 

// loop to string and invert it 
invertSubnetString := "" 
for i := 0; i<8; i++ { 
    if subnetString[i] == 48 { 
     invertSubnetString += "1" 
    } else { 
     invertSubnetString += "0" 
    } 
} 

// now I got invert data. So I can find broadcast number 
// convert it to int 
invertSubnet, _ := strconv.ParseInt(invertSubnetString, 2, 64) 

// then OR 
fmt.Println(networkIp | invertSubnet) 

Gibt es eine einfache Möglichkeit, das Ding, wie ich zu tun machen ?

Vielen Dank.

Antwort

2

Sie können die Bytes der Adresse direkt manipulieren, ohne Strings zu konvertieren:

https://play.golang.org/p/FfLu7Gb1HT

mask := net.CIDRMask(20, 32) 
ip := net.IP([]byte{140, 45, 32, 0}) 

broadcast := net.IP(make([]byte, 4)) 
for i := range ip { 
    broadcast[i] = ip[i] | ^mask[i] 
} 

fmt.Println(broadcast)