rot13密码有什么问题?

时间:2019-09-13 22:06:53

标签: go

我在tour.golang.org/methods/23

遇到了一些麻烦
package main

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

type rot13Reader struct {
    r io.Reader
}

func (r rot13Reader) Read(s []byte) (int, error) {
    a, e := r.r.Read(s)
    for i := 0; i < a; i++ {
        if(s[i] >= 'a') {
            s[i] = ((s[i] - 'a') + 13) % 26 + 'a'   
        }
        if(s[i] >= 'A') {
            s[i] = ((s[i] - 'A') + 13) % 26 + 'A'   
        }
    }
    return a, e
}

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

我要添加然后修改,但考虑到小写和大写的ASCII码之间的差异后,结果看起来并不正确

YHN VKTVDXW MAX VHWX!

3 个答案:

答案 0 :(得分:1)

如果直接使用字母的ascii值,则必须抵消它们。大写字母A-Z的ascii值为65-90(含),小写字母a-z的ascii值为97-122(含)。

答案 1 :(得分:1)

'A'(从数字上讲)是65。字母中较深的字母会增加,直到'Z'即90。

'a'(从数字上来说)是97。字母中更深的字母增加,直到'z',即122。

(不要问为什么我要记住一些ASCII。我确实必须查找z值。:-))

练习1:如果s[i]'a',即97,而您将其腐烂成'n'(110),是否大于65?当您进入 second if语句时会发生什么?

练习2:如果s[i]'_'(十进制95),那么会发生什么?

(您一直在更改问题,所以现在这些练习尚无定论。)

答案 2 :(得分:0)

确保只通过固定字母检查的范围来做字母

在“ a”和“ z”之间以及在“ A”和“ Z”之间

第二个Z需要大写时为小写