如何使用 golang 写 IP地址生成器

易霂 · · 766 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这个是同事提的一个需求,希望能给出一个开始地址和结束地址,能打印出两者之间的所有地址。这个本来可以简单的通过shell也可以完成(满255进1),不过刚好最近在学习golang,所以就想着用golang的位运算实现下ip地址的生成。原理也比较简单,先将IP地址数字化,通过循环遍历前后两个地址中间的数值,再将该数值转化为IP就OK了。代码如下:

//code from www.[linux](https://www.linuxprobe.com/ "linux")probe.com
package main
import (
"bytes"
"encoding/binary"
"fmt"
"net"
"strconv"
)
//ip到数字
func ip2Long(ip string) uint32 {
var long uint32
binary.Read(bytes.NewBuffer(net.ParseIP(ip).To4()), binary.BigEndian, &long)
return long
}
//数字到IP
func backtoIP4(ipInt int64) string {
// need to do two bit shifting and “0xff” masking
b0 := strconv.FormatInt((ipInt>>24)&0xff, 10)
b1 := strconv.FormatInt((ipInt>>16)&0xff, 10)
b2 := strconv.FormatInt((ipInt>>8)&0xff, 10)
b3 := strconv.FormatInt((ipInt & 0xff), 10)
return b0 + "." + b1 + "." + b2 + "." + b3
}
func main() {
result := ip2Long("98.138.253.109")
fmt.Println(result)
// or if you prefer the super fast way
faster := binary.BigEndian.Uint32(net.ParseIP("98.138.253.109")[12:16])
fmt.Println(faster)
faster64 := int64(faster)
fmt.Println(backtoIP4(faster64))
ip1 := ip2Long("221.177.0.0")
ip2 := ip2Long("221.177.7.255")
//ip1 := ip2Long("192.168.0.0")
//ip2 := ip2Long("192.168.0.255")
x := ip2 - ip1
fmt.Println(ip1, ip2, x)
for i := ip1; i < = ip2; i++ {
i := int64(i)
fmt.Println(backtoIP4(i))
}
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:易霂

查看原文:如何使用 golang 写 IP地址生成器

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

766 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传