github.com/code-to-go/safepool.lib@v0.0.0-20221205180519-ee25e63c226e/core/serialize.go (about) 1 package core 2 3 import ( 4 "encoding/binary" 5 "io" 6 ) 7 8 func WriteBytes(data []byte, w io.Writer) error { 9 lenB := make([]byte, 4) 10 binary.BigEndian.PutUint32(lenB, uint32(len(data))) 11 n, err := w.Write(lenB) 12 if err == nil && n != len(lenB) { 13 return io.ErrShortWrite 14 } 15 if IsErr(err, "cannot write data to stream: %v") { 16 return err 17 } 18 19 n, err = w.Write(data) 20 if err == nil && n != len(data) { 21 return io.ErrShortWrite 22 } 23 IsErr(err, "cannot write data to stream: %v") 24 return err 25 } 26 27 func ReadBytes(r io.Reader) ([]byte, error) { 28 lenB := make([]byte, 4) 29 n, err := r.Read(lenB) 30 if err == io.EOF || IsErr(err, "cannot read data from stream: %v") { 31 return nil, err 32 } 33 if n != len(lenB) { 34 return nil, io.ErrNoProgress 35 } 36 37 data := make([]byte, binary.BigEndian.Uint32(lenB)) 38 n = 0 39 cnt := 4 + len(data)/64 40 for n < len(data) { 41 m, err := r.Read(data[n:]) 42 if err == io.EOF || IsErr(err, "cannot read data from stream: %v") { 43 return nil, err 44 } 45 n += m 46 cnt-- 47 if cnt == 0 { 48 return nil, io.ErrNoProgress 49 } 50 } 51 52 return data, nil 53 }