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  }