neoneo-go/pkg/util/binaryWriter.go

74 lines
1.8 KiB
Go
Raw Normal View History

2019-02-25 22:44:14 +00:00
package util
import (
"encoding/binary"
"io"
)
//BinWriter is a convenient wrapper around a io.Writer and err object
// Used to simplify error handling when writing into a io.Writer
// from a struct with many fields
2019-02-25 22:44:14 +00:00
type BinWriter struct {
w io.Writer
2019-02-25 22:44:14 +00:00
Err error
}
// NewBinWriterFromIO makes a BinWriter from io.Writer.
func NewBinWriterFromIO(iow io.Writer) *BinWriter {
return &BinWriter{w: iow}
}
// WriteLE writes into the underlying io.Writer from an object v in little-endian format
func (w *BinWriter) WriteLE(v interface{}) {
2019-02-25 22:44:14 +00:00
if w.Err != nil {
return
}
w.Err = binary.Write(w.w, binary.LittleEndian, v)
2019-02-25 22:44:14 +00:00
}
// WriteBE writes into the underlying io.Writer from an object v in big-endian format
func (w *BinWriter) WriteBE(v interface{}) {
2019-02-25 22:44:14 +00:00
if w.Err != nil {
return
}
w.Err = binary.Write(w.w, binary.BigEndian, v)
2019-02-25 22:44:14 +00:00
}
// WriteVarUint writes a uint64 into the underlying writer using variable-length encoding
func (w *BinWriter) WriteVarUint(val uint64) {
if w.Err != nil {
return
}
2019-02-25 22:44:14 +00:00
if val < 0xfd {
w.Err = binary.Write(w.w, binary.LittleEndian, uint8(val))
2019-02-25 22:44:14 +00:00
return
}
if val < 0xFFFF {
w.Err = binary.Write(w.w, binary.LittleEndian, byte(0xfd))
w.Err = binary.Write(w.w, binary.LittleEndian, uint16(val))
2019-02-25 22:44:14 +00:00
return
}
if val < 0xFFFFFFFF {
w.Err = binary.Write(w.w, binary.LittleEndian, byte(0xfe))
w.Err = binary.Write(w.w, binary.LittleEndian, uint32(val))
2019-02-25 22:44:14 +00:00
return
}
w.Err = binary.Write(w.w, binary.LittleEndian, byte(0xff))
w.Err = binary.Write(w.w, binary.LittleEndian, val)
2019-02-25 22:44:14 +00:00
}
// WriteBytes writes a variable length byte array into the underlying io.Writer
func (w *BinWriter) WriteBytes(b []byte) {
w.WriteVarUint(uint64(len(b)))
w.WriteLE(b)
2019-02-25 22:44:14 +00:00
}
// WriteString writes a variable length string into the underlying io.Writer
func (w *BinWriter) WriteString(s string) {
w.WriteBytes([]byte(s))
}