33. 利用数据流实现密码代换功能

作者: 厚土火焱 | 来源:发表于2017-08-20 15:26 被阅读71次

    利用 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 whaobwvna@dd.pbz")
        s1 := strings.NewReader("You cracked the code? Yes,My email is junbojian@qq.com")
    
        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 junbojian@qq.com
    Lbh penpxrq gur pbqr? Lrf,Zl rznvy vf whaobwvna@dd.pbz
    

    把运行结果和代码中的 s 和 s1 做一下比较,可知,转换是成功的。

    相关文章

      网友评论

        本文标题:33. 利用数据流实现密码代换功能

        本文链接:https://www.haomeiwen.com/subject/dyjfdxtx.html