h Header // keep block offsets
}
-func NewReader(rd io.ReaderAt, off uint32) *Reader {
- r := &Reader{rd: rd, start: off}
- err := r.h.Read(r)
- if err != nil {
- return nil
- }
- return r
-}
-
func NewReaderFromBytes(b []byte, readonly bool) *Reader {
r := &Reader{b: b, readonly: readonly, rd: bytes.NewReader(b), start: 0}
err := r.h.Read(r)
if len == 0 {
return nil
}
- if r.b != nil {
- end := int(off) + len
- return r.b[int(off):end:end]
- }
- b := make([]byte, len)
- _, err := r.rd.ReadAt(b, int64(r.start+off))
- if err != nil {
- panic("corrupted input")
- }
- return b
+ end := int(off) + len
+ return r.b[int(off):end:end]
}
func (r *Reader) uint64At(off uint32) uint64 {
func (r *Reader) StringAt(off uint32) string {
l := r.uint32At(off)
- if r.b != nil {
- b := r.b[off+4 : off+4+l]
- if r.readonly {
- return toString(b) // backed by RO memory, ok to make unsafe string
- }
- return string(b)
- }
- b := make([]byte, l)
- n, err := r.rd.ReadAt(b, int64(r.start+off+4))
- if n != int(l) || err != nil {
- panic("corrupted input")
+ b := r.b[off+4 : off+4+l]
+ if r.readonly {
+ return toString(b) // backed by RO memory, ok to make unsafe string
}
return string(b)
}