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"-"!")"的部分,我只是需要确认一下这个"字符串">

我如何摆脱这些额外的"东西"?有没有更好的方法来实现我的想法?

这些是后台数组中剩余的可用字节。

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

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

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

你所看到的是fmt.Printf的最好的尝试通过反射来渲染这个结构类型的值作为一个字符串。

你想:

var fub bytes.Buffer
// fmt.Printf("string after  %snn", fub)
fmt.Printf("string after  %snn", &fub) // fix
fmt.Printf("string after  %snn", fub.String()) // or this

为什么这个工作?检查bytes.Buffer文档,你可以看到String() string方法期望一个指针接收器,所以如果你想利用这个基于反射的函数,比如fmt.Printf,你必须传入一个*bytes.Buffer类型的值。

相关内容

  • 没有找到相关文章

最新更新