我试图改变来自流的字节,因为解码,但它不起作用

我正在尝试io.ReaderCloser使用可以传递给 JSON 解码器的自定义阅读器来包装一个,它在生产中将来自请求处理程序。


我创建了以下


import (

    "io"

)


// RemoveNull is a stream wrapper that should remove null bytes from the byte stream

type RemoveNull struct {

    Reader io.ReadCloser

}


// NewRemoveNullStream creates a new RemoveNull reader which passes the stream through a null check first

func NewRemoveNullStream(reader io.ReadCloser) RemoveNull {

    return RemoveNull{

        Reader: reader,

    }

}


// Read wraps a Reader to remove null bytes in the stream

func (null RemoveNull) Read(p []byte) (n int, err error) {

    n, err = null.Reader.Read(p)

    if err != nil {

        return n, err

    }


    nn := 0

    for i := range p {

        if p[i] != 0 {

            p[nn] = p[i]

            nn++


        }

    }

    p = p[:nn]

    // fmt.Println(p) i can see the value of p changing and all the null bytes are removed

    return n, nil

}


// Close closes the internal reader

func (null RemoveNull) Close() error {

    return null.Close()

}

当我运行以下命令时,我可以从 print 语句中看到确实删除了所有空字节,并且 len(p) == 所有预期好字节的大小。我写了下面的测试,看看代码是否按我的预期工作,这就是我意识到它不是的地方。

从测试中我可以看到解码时所有空字节仍然存在,但在 RemoveNull 阅读器中我可以看到所有空字节都已从下划线数组中删除。关于什么是错的以及如何实现从流中删除字节以避免让解码器解码空字节的目标的任何想法?



千万里不及你
浏览 116回答 1
1回答

DIEA

您的 Read 实现中存在错误。它在 io.EOF 的情况下过早终止,其中同时存在错误和数据。它返回读取的错误字节数。分配切片的最后一部分也没有意义,因为它不会更新传递给函数的切片。尝试这个:func (null RemoveNull) Read(p []byte) (n int, err error) {&nbsp; &nbsp; n, err = null.Reader.Read(p)&nbsp; &nbsp; nn := 0&nbsp; &nbsp; for i:=0;i<n;i++ {&nbsp; &nbsp; &nbsp; &nbsp; if p[i] != 0 {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p[nn] = p[i]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nn++&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return nn, err}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go