github.com/btccom/go-micro/v2@v2.9.3/codec/protorpc/netstring.go (about)

     1  package protorpc
     2  
     3  import (
     4  	"encoding/binary"
     5  	"io"
     6  )
     7  
     8  // WriteNetString writes data to a big-endian netstring on a Writer.
     9  // Size is always a 32-bit unsigned int.
    10  func WriteNetString(w io.Writer, data []byte) (written int, err error) {
    11  	size := make([]byte, 4)
    12  	binary.BigEndian.PutUint32(size, uint32(len(data)))
    13  	if written, err = w.Write(size); err != nil {
    14  		return
    15  	}
    16  	return w.Write(data)
    17  }
    18  
    19  // ReadNetString reads data from a big-endian netstring.
    20  func ReadNetString(r io.Reader) (data []byte, err error) {
    21  	sizeBuf := make([]byte, 4)
    22  	_, err = r.Read(sizeBuf)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	size := binary.BigEndian.Uint32(sizeBuf)
    27  	if size == 0 {
    28  		return nil, nil
    29  	}
    30  	data = make([]byte, size)
    31  	_, err = r.Read(data)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	return
    36  }