mirror of
https://github.com/go-micro/go-micro.git
synced 2024-12-18 08:26:38 +02:00
37 lines
782 B
Go
37 lines
782 B
Go
|
package proto
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
// WriteNetString writes data to a big-endian netstring on a Writer.
|
||
|
// Size is always a 32-bit unsigned int.
|
||
|
func WriteNetString(w io.Writer, data []byte) (written int, err error) {
|
||
|
size := make([]byte, 4)
|
||
|
binary.BigEndian.PutUint32(size, uint32(len(data)))
|
||
|
if written, err = w.Write(size); err != nil {
|
||
|
return
|
||
|
}
|
||
|
return w.Write(data)
|
||
|
}
|
||
|
|
||
|
// ReadNetString reads data from a big-endian netstring.
|
||
|
func ReadNetString(r io.Reader) (data []byte, err error) {
|
||
|
sizeBuf := make([]byte, 4)
|
||
|
_, err = r.Read(sizeBuf)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
size := binary.BigEndian.Uint32(sizeBuf)
|
||
|
if size == 0 {
|
||
|
return nil, nil
|
||
|
}
|
||
|
data = make([]byte, size)
|
||
|
_, err = r.Read(data)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return
|
||
|
}
|