为了账号安全,请及时绑定邮箱和手机立即绑定

Go 练习之旅 #23:rot13Reader

Go 练习之旅 #23:rot13Reader

Go
FFIVE 2021-10-25 17:09:57
我正在尝试解决 Go 练习rot13Reader之旅:这是我的解决方案:package mainimport (    "io"    "os"    "strings")type rot13Reader struct {    r io.Reader}func rot13(x byte) byte {    switch {    case x >= 65 && x <= 77:        fallthrough    case x >= 97 && x <= 109:        x = x + 13    case x >= 78 && x <= 90:        fallthrough    case x >= 110 && x >= 122:        x = x - 13    }    return x}func (r13 *rot13Reader) Read(b []byte) (int, error) {    n, err := r13.r.Read(b)    for i := 0; i <= n; i++ {        b[i] = rot13(b[i])    }    return n, err}func main() {    s := strings.NewReader("Lbh penpxrq gur pbqr!")    r := rot13Reader{s}    io.Copy(os.Stdout, &r)}它返回You prnpxrq tur poqr!,这仅表示“Lbh penpxrq gur pbqr!”的第一个单词。裂开了。我怎样才能破解整个句子?
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

我更喜欢在 rot13 函数中直接操作整数


package main


import (

    "io"

    "os"

    "strings"

)


type rot13Reader struct {

    r io.Reader

}


const a int = int('a')

const z int = int('z')


const A int = int('A')

const Z int = int('Z')


func rot13(b int) int {


    isLower := b >= a && b <= z

    isUpper := b >= A && b <= Z


    if isLower {

        return a + ((b - a + 13) % 26)

    }


    if isUpper {

        return A + ((b - A + 13) % 26)

    }


    return b

}


func (rot *rot13Reader) Read(b []byte) (int, error) {

    n, err := rot.r.Read(b)

    if err == io.EOF {

        return 0, err

    }


    for x := range b {

        b[x] = byte(rot13(int(b[x])))

    }

    return n, err

}


func main() {

    s := strings.NewReader("Lbh penpxrq gur pbqr!")

    r := rot13Reader{s}

    io.Copy(os.Stdout, &r)

}


查看完整回答
反对 回复 2021-10-25
  • 3 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信