Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert struct to []byte with Go

Tags:

tcp

go

I have a packet structure and I wish to serialize it into binary so I can send it through the wire.

There are many packet structures but I'll give the login packet as an example:

login struct {
    seq      uint8
    id       uint16
    username [16]string
    password [16]string
    unknown1 [16]byte
}

I've read somewhere that you can't use binary.Write for non-fixed size structures. But I believe my structure is fixed size (correct me if I'm wrong, I could be very wrong).

Now using this code:

var buf bytes.Buffer
x := login{
    seq:      2,
    id:       1,
    username: [16]string{"username"},
    password: [16]string{"password"},
}
err := binary.Write(&buf, binary.LittleEndian, x)
if err != nil {
    log.Fatalln(err)
}

Gives me the error: binary.Write: invalid type main.login

Now, is there a way to fix this? Is there an alternative approach? Much like how you can use structs in C and send it through the network.

like image 645
majidarif Avatar asked Feb 06 '17 16:02

majidarif


1 Answers

You have two errors in your code. Firstly, your struct fields should be exported for encoding/binary to see it.

Secondly, [16]string means an array of 16 strings, not a 16-byte string. So your struct should look like this:

type login struct {
    Seq      uint8
    ID       uint16
    Username [16]byte
    Password [16]byte
    Unknown1 [16]byte
}

Then it works: https://play.golang.org/p/Nq8fRqgkcp.

like image 110
Ainar-G Avatar answered Oct 18 '22 08:10

Ainar-G