1
0
mirror of https://github.com/fumiama/go-base16384.git synced 2026-06-05 00:32:52 +08:00
Files
go-base16384/encoder.go
2025-10-27 22:26:01 +08:00

69 lines
1.1 KiB
Go

package base14
import (
"bytes"
"io"
)
type Encoder struct {
b []byte
w io.Writer
io.WriteCloser
io.ReaderFrom
}
func NewEncoder(w io.Writer) *Encoder {
return &Encoder{w: w}
}
func (e *Encoder) ReadFrom(r io.Reader) (int64, error) {
if r == nil {
return 0, nil
}
i := len(e.b)
if i == 0 && e.w == nil {
return 0, io.EOF
}
n := 0
iseof := false
for !iseof {
inlen := 1024 / 8 * 7 // batch size
e.b = append(e.b, make([]byte, inlen)...)
cnt, err := r.Read(e.b[i:])
n += cnt
iseof = err == io.EOF
if err != nil {
if !iseof {
return int64(n), err
}
}
e.b = e.b[:i+cnt]
inlen = len(e.b) / 8 * 7 // real batch size
if inlen == 0 {
if iseof {
return int64(n), nil
}
i = len(e.b)
continue
}
_, err = e.w.Write(Encode(e.b[:inlen]))
if err != nil {
return int64(n), err
}
i = copy(e.b, e.b[inlen:])
e.b = e.b[:i]
}
return int64(n), nil
}
func (e *Encoder) Write(p []byte) (int, error) {
n, err := e.ReadFrom(bytes.NewReader(p))
return int(n), err
}
func (e *Encoder) Close() error {
_, err := e.w.Write(Encode(e.b))
e.b = nil
return err
}