gpt4 book ai didi

Go/GoLang倒置二进制数据寻找广播地址

转载 作者:数据小太阳 更新时间:2023-10-29 03:06:04 26 4
gpt4 key购买 nike

我尝试反转 golang 中的二进制文件以从输入数据中找到广播 ip 地址。

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

假设用户输入

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

所以如果我现在从用户输入中得到子网掩码,我需要反转它

// 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)

有什么简单的方法可以像我一样做这件事吗?

最佳答案

您可以直接操作地址的字节,而无需转换为字符串:

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)

关于Go/GoLang倒置二进制数据寻找广播地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37733519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com