Skip to content

Instantly share code, notes, and snippets.

@fd0
Created May 12, 2013 20:28
Show Gist options
  • Save fd0/5564798 to your computer and use it in GitHub Desktop.
Save fd0/5564798 to your computer and use it in GitHub Desktop.
package main
import (
"encoding/binary"
"fmt"
"io"
"os"
"strings"
)
type Message struct {
Name string
Text string
}
func readString(reader io.Reader) (string, error) {
var len uint8
var buf []byte
err := binary.Read(reader, binary.LittleEndian, &len)
if err != nil {
fmt.Fprint(os.Stderr, "error reading len: ", err, "\n")
return "", err
}
buf = make([]byte, len)
n, err := reader.Read(buf)
if err != nil {
fmt.Fprintf(os.Stderr, "error reading string: ", err, "\n")
return "", err
}
if uint8(n) != len {
fmt.Fprintf(os.Stderr, "unable to read %d bytes, only got %d!\n", len, n)
return "", nil
}
var str = string(buf)
return str, nil
}
func ParseMessage(reader io.Reader) (*Message, error) {
var msg Message
var err error
msg.Name, err = readString(reader)
if err != nil {
return nil, err
}
msg.Text, err = readString(reader)
if err != nil {
return nil, err
}
return &msg, nil
}
func main() {
data := "\x10Das ist ein Test\x19Dies hier aber nicht mehr"
reader := strings.NewReader(data)
msg, err := ParseMessage(reader)
if err != nil {
fmt.Fprint(os.Stderr, "error reading string: ", err, "\n")
}
fmt.Printf("Message: %+v\n", msg)
}
@fd0
Copy link
Author

fd0 commented May 12, 2013

output:

$ go run test.go
Message: &{Name:Das ist ein Test Text:Dies hier aber nicht mehr}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment