去io读者包装

时间:2013-11-20 02:30:31

标签: go

我编写了以下代码,试图将13位字母数字加密。这是go之旅中的一个例子。 我已经使用日志库来检查字节数组p中的值,在密码之后,它们似乎被旋转了13.由于某种原因,当它打印到STDOUT时,字符不会被加密。 我正在改变字节数组p错误?

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

func cipher(in byte) (out byte) {
    out = in
    if in > 64 && in < 91 {
        out = in - 64
        out = out + 13
        out = out % 26
        out = out + 64
    }
    if in > 96 && in < 123 {
        out = in - 96
        out = out + 13
        out = out % 26
        out = out + 96
    }
    return
}

func (reader rot13Reader) Read(p []byte) (n int, err error) {
    for index := range p {
        p[index] = cipher(p[index])
    }
    n, err = reader.r.Read(p)
    return
}

func main() {
    s := strings.NewReader(
        "Lbh penpxrq gur pbqr!\n")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

1 个答案:

答案 0 :(得分:1)

rot13Reader.Read方法中,您首先将cipher应用于p中的任何数据,然后通过阅读子读取器覆盖该数据。

如果目标是解码您所阅读的内容,则应按相反的顺序执行这两项操作。