当前位置: > > > > 如何创建一个读取器,读取前 N 个字节一次,然后读取其余字节?
如何创建一个读取器,读取前 N 个字节一次,然后读取其余字节?
来源:stackoverflow
2024-04-27 15:12:51
0浏览
收藏
今天米云给大家带来了《如何创建一个读取器,读取前 N 个字节一次,然后读取其余字节?》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~
问题内容
我想读取前n个字节一次,然后我想读取其余部分直到io.eof。您对以下代码有何看法?这是最好的方法吗?
如果给定的读取器 (r) 不是以第一个字节开头,则应返回错误。否则,它应该继续读取一组固定字节之后的其余部分(在代码中标记为“first”)。
您可以将“第一个”部分视为魔术格式签名。
type reader struct {
r io.Reader
first []byte
}
func (r *reader) Read(b []byte) (n int, err error) {
const first = "first"
n, err = r.r.Read(b)
if len(r.first) >= len(first) {
return n, err
}
if l := len(first); n > l {
b = b[:l]
}
r.first = append(r.first, b...)
if len(r.first) >= len(first) {
if !bytes.HasPrefix(r.first, []byte(first)) {
err = errors.New("not first")
}
}
return n, err
}
源代码在演示中:https://play.golang.org/p/4xzeqcaxyxc
解决方案
您的实现看起来比必要的更复杂:
type reader struct {
r io.Reader
first []byte
offset int
}
func (r *reader) Read(b []byte) (n int, err error) {
n, err = r.r.Read(b)
for i := 0; r.offset < len(r.first) && i < n; r.offset++ {
if r.first[r.offset] != b[i] {
return n, errors.New("mismatch")
}
i++
}
return n, err
}
以上就是《如何创建一个读取器,读取前 N 个字节一次,然后读取其余字节?》的详细内容,更多关于的资料请关注米云公众号!
