利用 go 语言的 io.Reader 包裹另一个 io.Reader 的模式,修改数据流中的字符串(密码)代换功能。
提供一个字母和数字组合的字符串,对这个字符串利用 Read 读取的同时进行代换。对常见的特殊符号保持不变。对密码规定之外的字符忽略。
在 Read 内,首先使用一个 io.Reader 获取完整字符串
l, err := rot.r.Read(buf)
然后利用 range 遍历,对每一个字符进行代换。
for i, v := range buf{
buf[i] = rot13[v]
}
当遍历到字符串末尾,跳出遍历循环。
if v == byte(0){
return i, nil
}
rot13是代换的对照字典
rot13 := map[byte]byte{
......
}
完整程序代码
package main
import (
"io"
"os"
"strings"
"errors"
"fmt"
)
type rot13Reader struct {
r io.Reader
}
func (rot *rot13Reader) Read(buf []byte) (n int, err error) {
rot13 := map[byte]byte{
'A':'N',
'B':'O',
'C':'P',
'D':'Q',
'E':'R',
'F':'S',
'G':'T',
'H':'U',
'I':'V',
'J':'W',
'K':'X',
'L':'Y',
'M':'Z',
'N':'A',
'O':'B',
'P':'C',
'Q':'D',
'R':'E',
'S':'F',
'T':'G',
'U':'H',
'V':'I',
'W':'J',
'X':'K',
'Y':'L',
'Z':'M',
'a':'n',
'b':'o',
'c':'p',
'd':'q',
'e':'r',
'f':'s',
'g':'t',
'h':'u',
'i':'v',
'j':'w',
'k':'x',
'l':'y',
'm':'z',
'n':'a',
'o':'b',
'p':'c',
'q':'d',
'r':'e',
's':'f',
't':'g',
'u':'h',
'v':'i',
'w':'j',
'x':'k',
'y':'l',
'z':'m',
'0':'9',
'1':'8',
'2':'7',
'3':'6',
'4':'5',
'5':'4',
'6':'3',
'7':'2',
'8':'1',
'9':'0',
' ':' ',
'~':'~',
'!':'!',
'@':'@',
'#':'#',
'$':'$',
'%':'%',
'^':'^',
'&':'&',
'*':'*',
'(':'(',
')':')',
'_':'_',
'+':'+',
'`':'`',
'-':'-',
'=':'=',
'?':'?',
',':',',
'.':'.',
}
l, err := rot.r.Read(buf)
if err != nil{
return 0, errors.New("Read something wrong")
}
for i, v := range buf{
if v == byte(0){
return i, nil
}
buf[i] = rot13[v]
}
return l, nil
}
func main() {
s := strings.NewReader("Lbh penpxrq gur pbqr? Lrf,Zl rznvy vf [email protected]")
s1 := strings.NewReader("You cracked the code? Yes,My email is [email protected]")
r := rot13Reader{s}
r1 := rot13Reader{s1}
io.Copy(os.Stdout, &r)
fmt.Println("")
io.Copy(os.Stdout, &r1)
}
这段程序为了演示功能的需要,对字符串代换前 s1和代换后 s 都做了一次代换执行。自此,可以看出此段代码的功能实现目的,是为了对需要转换的内容(比如密码)进行一次简单转换。
运行结果
You cracked the code? Yes,My email is [email protected]
Lbh penpxrq gur pbqr? Lrf,Zl rznvy vf [email protected]
把运行结果和代码中的 s 和 s1 做一下比较,可知,转换是成功的。