第二章 内容补充

内容补充:

IO 和 端口解析结合

main.go
package main

import "black-hat/IoAndParse/IO"

func main() {
	IO.Input()
}
io.go
package IO

import (
	"black-hat/IoAndParse/parse"
	"fmt"
	"log"
	"os"
	"strings"
)

// FooReader defines an io.Reader to read from stdin.
type FooReader struct{}

// Read reads data from stdin.
func (fooReader *FooReader) Read(b []byte) (int, error) {
	fmt.Print("in > ")
	return os.Stdin.Read(b)
}

func Input() {
	// Instantiate reader and writer.
	var (
		reader FooReader
	)

	// Create buffer to hold input/output.
	input := make([]byte, 4096)

	// Use reader to read input.
	s, err := reader.Read(input)
	if err != nil {
		log.Fatalln("Unable to read data")
	}
	fmt.Printf("Read %d bytes from stdin\n", s)
	// Use writer to write output.
	//这里要求传递的参数是字符串
	//这个地方卡了好久
	//问题可能出现在字符串的格式上。
	//因为你直接将读取的字节数据转换为字符串,
	//但是用户输入的数据格式可能不是严格的文本字符串
	//而是包含了换行符或其他非可见字符。
	//为了解决这个问题,你可以对读取的字节数据进行处理,去除可能的换行符等非可见字符,然后再将其转换为字符串。
	//可以使用 strings.TrimSpace 函数来去除字符串两端的空白字符,确保得到的字符串是干净的。
	//因为是以字节的形式读取的所以可能换行符什么也读进去了
	str := strings.TrimSpace(string(input[:s]))
	fmt.Println(str)
	parsePort, err := parse.Parse(str)
	if err != nil {
		log.Fatalln("Unable to parse input")
	}
	for index, port := range parsePort {
		ports := fmt.Sprintf("%d port:%d", index, port)
		fmt.Println(ports)
	}
}
parse.go
package parse

import (
	"errors"
	"fmt"
	"strconv"
	"strings"
)

const (
	porterrmsg = "Invalid port specification"
)

func Foo(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Println(v, "is int")
	case string:
		fmt.Println(v, "is string")
	default:
		fmt.Println("UnKnow")
	}
}

func dashSplit(sp string, ports *[]int) error {
	//以-为分隔符进行分割,得到的结构以字符串的形式存入字符串切片中
	dp := strings.Split(sp, "-")
	if len(dp) != 2 {
		return errors.New(porterrmsg)
	}
	//将开始的端口号的形式从字符串转换为整型数
	start, err := strconv.Atoi(dp[0])
	if err != nil {
		return errors.New(porterrmsg)
	}
	fmt.Println(dp[1])
	Foo(dp[1]) //是stirng类型啊
	//加一个字符串读出来的过程
	end, err := strconv.Atoi(dp[1]) //一直出问题不知道为啥,读出来变成0
	//直接用另一种方式转
	fmt.Println(end)
	if err != nil {
		return errors.New(porterrmsg)
	}
	//确保端口范围在有效范围里面
	if start > end || start < 1 || end > 65535 {
		return errors.New(porterrmsg)
	}
	for ; start <= end; start++ {
		*ports = append(*ports, start)
	}
	return nil
}

func convertAndAddPort(p string, ports *[]int) error {
	i, err := strconv.Atoi(p)
	if err != nil {
		return errors.New(porterrmsg)
	}
	if i < 1 || i > 65535 {
		return errors.New(porterrmsg)
	}
	*ports = append(*ports, i)
	return nil
}

// Parse turns a string of ports separated by '-' or ',' and returns a slice of Ints.
func Parse(s string) ([]int, error) {
	//创建一个空的整数切片,用于存储解析后的端口。
	ports := []int{}
	//如果字符串包含逗号和破折号,表示可能包含多个端口和端口范围。
	if strings.Contains(s, ",") && strings.Contains(s, "-") {
		sp := strings.Split(s, ",")
		for _, p := range sp {
			if strings.Contains(p, "-") {
				if err := dashSplit(p, &ports); err != nil {
					return ports, err
				}
			} else {
				if err := convertAndAddPort(p, &ports); err != nil {
					return ports, err
				}
			}
		}
	} else if strings.Contains(s, ",") {
		sp := strings.Split(s, ",")
		for _, p := range sp {
			convertAndAddPort(p, &ports)
		}
	} else if strings.Contains(s, "-") {
		if err := dashSplit(s, &ports); err != nil {
			return ports, err
		}
	} else {
		if err := convertAndAddPort(s, &ports); err != nil {
			return ports, err
		}
	}
	return ports, nil
}

摆烂了一段时间,把之前内容补充一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newbie_______

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值