学习 Go 语言 0x0a:《Go 语言之旅》中 rot13Reader 练习题

本文介绍了一种使用Go语言实现的ROT13代换密码解密方法。通过创建一个符合io.Reader接口的rot13Reader类型,文章展示了如何对输入的数据流进行ROT13加密或解密,并给出了完整的代码示例。

★ 题目

https://tour.go-zh.org/methods/23

练习:rot13Reader
有种常见的模式是一个 io.Reader 包装另一个 io.Reader,然后通过某种方式修改其数据流。

例如,gzip.NewReader 函数接受一个 io.Reader(已压缩的数据流)并返回一个同样实现了 io.Reader*gzip.Reader(解压后的数据流)。

编写一个实现了 io.Reader 并从另一个 io.Reader 中读取数据的 rot13Reader,通过应用 rot13 代换密码对数据流进行修改。

rot13Reader 类型已经提供。实现 Read 方法以满足 io.Reader

★ 代码

package main

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

type rot13Reader struct {
	r io.Reader
}

func (r13 rot13Reader) Read(buf []byte) (int, error) {
    inbuf := make([]byte, 128)
    n, err  := r13.r.Read(inbuf)
    if err != nil {
        return 0, nil
    }
    for i := 0; i < n; i++ {
        if inbuf[i] >= 'N' && inbuf[i] <= 'Z' || inbuf[i] >= 'n' && inbuf[i] <= 'z' {
            buf[i] = inbuf[i] - 13
        } else if inbuf[i] >= 'A' && inbuf[i] < 'N' || inbuf[i] >= 'a' && inbuf[i] < 'n' {
            buf[i] = inbuf[i] + 13
        } else {
            buf[i] = inbuf[i]
        }
    }
    return n, nil
}

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

输出:You cracked the code!

如果在 https://tour.go-zh.org/methods/23 这里运行提示 process took too long,可以到 https://golang.google.cn/ 主页中来测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值