How to Implement a Custom Binary Protocol Parser in Go

Use encoding/binary to read fixed-size fields from an io.Reader into a Go struct for custom binary protocol parsing.

Implement a custom binary protocol parser in Go by defining a struct for your message format and using encoding/binary to read fields sequentially from an io.Reader.

package main

import (
	"encoding/binary"
	"fmt"
	"io"
)

type Message struct {
	ID    uint16
	Len   uint32
	Data  []byte
}

func ParseMessage(r io.Reader) (*Message, error) {
	var m Message
	if err := binary.Read(r, binary.BigEndian, &m.ID); err != nil {
		return nil, err
	}
	if err := binary.Read(r, binary.BigEndian, &m.Len); err != nil {
		return nil, err
	}
	m.Data = make([]byte, m.Len)
	if _, err := io.ReadFull(r, m.Data); err != nil {
		return nil, err
	}
	return &m, nil
}

func main() {
	// Example usage with a buffer
	// msg, err := ParseMessage(reader)
	fmt.Println("Parser ready")
}