微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ROT13 使用字节而不是字符串

如何解决ROT13 使用字节而不是字符串

我正在尝试向我的工具添加 rot13 翻译。 客户端基本代码

....
buf := make([]byte,1024)

for {

    n,err := in.Read(buf)
    .....

    for _,chunk := range split(r,buf[:n],sizes) {
        if _,err := out.Write(chunk); err != nil {
        ......

因为我希望它使用字节而不是字符串,所以我想出了这个:

https://play.golang.org/p/m3NvoZIyS8g

这个例子有效,期待一些我不明白的额外字节,它们用***下划线:

bytes after  ***{***[89 111 117 32 99 114 97 99 107 101 100 32 116 104 101 32 99 111 
100 101 
32 32 32 32 32 32 32 239 191 189 85 239 191 189 239 191 189 239 191 189 74 40 239 191 
189 47 239 191 189 86 239 191 189 45 239 191 189 33] ***0 0}***

string after ***{***You cracked the code       �U���J(�/�V�-�! ***%!s(int=0)*** 
***%!s(bytes.readOp=0)}***

请忽略带有"�U���J(�/�V�-�!"的部分,我只需要对这个“字符串”进行一些确认

我如何摆脱这些额外的“东西”? 有什么办法可以更好地实现我的想法吗?

解决方法

那些是保留在 fub 后备数组中的可用字节。

因为你是原始打印的,所以它显示了它的所有内部。

你想写:fmt.Printf("bytes after %v\n",fub.Bytes()) 只得到写在上面的部分。

同样适用于字符串表示,使用fmt.Printf("string after %s\n\n",fub.String())

,

您所看到的是 fmt.Printf 通过反射将此 struct type 的值呈现为字符串的最佳尝试。

你想要:

var fub bytes.Buffer

// fmt.Printf("string after  %s\n\n",fub)

fmt.Printf("string after  %s\n\n",&fub) // fix
fmt.Printf("string after  %s\n\n",fub.String()) // or this

为什么会这样?检查 bytes.Bufferdocs 你可以看到 String() string 方法需要一个指针接收器,所以如果你想通过像 fmt.Printf 这样的基于反射的函数来利用它,你必须传入 *bytes.Buffer 类型的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。