2 回答
TA贡献1830条经验 获得超9个赞
好的,所以我最终使用我自己的阅读器实现来解决这个问题。
基本上结构看起来像这样:
type reader struct {
at int
n int
f io.ReadCloser
buf []byte
}
这可以附加到 zlib 阅读器:
// Open file for reading
fi, err := os.Open(filename)
if err != nil {
return nil, err
}
defer fi.Close()
// Attach zlib reader
r := new(reader)
r.buf = make([]byte, 2048)
r.f, err = zlib.NewReader(fi)
if err != nil {
return nil, err
}
defer r.f.Close()
然后可以使用如下函数直接从 zlib 读取器中读取 x 个字节:
mydata := r.readx(10)
func (r *reader) readx(x int) []byte {
for r.n < x {
copy(r.buf, r.buf[r.at:r.at+r.n])
r.at = 0
m, err := r.f.Read(r.buf[r.n:])
if err != nil {
panic(err)
}
r.n += m
}
tmp := make([]byte, x)
copy(tmp, r.buf[r.at:r.at+x]) // must be copied to avoid memory leak
r.at += x
r.n -= x
return tmp
}
请注意,我不需要检查 EOF,因为我的解析器应该在正确的位置停止。
- 2 回答
- 0 关注
- 258 浏览
添加回答
举报