golang casting-byte-array auf struct
Ich bin auf der Suche für saubere Art und Weise zu casten byte-array in struct für client-server-Anwendung.
Ich weiß die meisten ppl drehen, um gob-Paket für diese Lösung ist allerdings das ich nicht kontrollieren Sie die Kodierung für die Anwendung. that being said, ich habe nur programmiert, der server-Anwendung nicht auf dem client, es ist ein gegenseitiger Vertrag, für das Protokoll, die gerade ausgetauscht wird.
Die besten, die ich kommen könnte, ist die folgende.
type T struct {
A int16
B int8
C []byte
}
func main() {
//Create a struct and write it.
t := T{A: 99, B: 10}
buf := &bytes.Buffer{}
buf1 := []byte{5, 100, 100}
fmt.Println(buf1)
buf.Write(buf1)
//err := binary.Write(buf, binary.BigEndian, t)
//if err != nil {
// panic(err)
//}
fmt.Println(buf)
//Read into an empty struct.
t = T{}
err := binary.Read(buf, binary.BigEndian, &t)
if err != nil {
panic(err)
}
fmt.Printf("%d %d", t.A, t.B)
}
Jedoch, sobald die Anzahl bytes, die nicht übereinstimmen mit der Größe der Struktur, dann gehen senden eine Panik. Wie kann ich ändern, das funktioniert auch ohne die Panik, wenn Sie unter-oder übergröße
- Sie nur die server-Seite, heißt, Sie haben bereits das serielle Protokoll. Welches Protokoll Sie haben, ist der entscheidende Punkt deiner Frage. golang haben-Codierung-Paket Unterstützung für weit verbreitete Protokolle wie JSON, BSON-oder PROTOBUF. so finden Sie heraus, die serielle Protokoll, und wählen Sie die encoding-Paket. oder, wenn Sie haben ein eigenes Protokoll implementieren eine Kodierung selbst.
- Es ist eigenes Protokoll. Beispiele/Artikel/goplayground?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gegeben, dass Sie verwenden ein eigenes Protokoll. Es ist eine gute Idee, um implementieren Ihr eigenes Protokoll. Es gibt viele Beispiele der wie, dies zu tun.
Sind Sie nur begrenzt durch die Umsetzung Ihres encoders. Ich würde empfehlen, sich auf die json.Decoder für den Umgang Puffer anstatt uns auf gerade byte-slices. Diese arbeiten auf Puffern und sind sehr nützlich für große Datenströme.
Laut http://golang.org/pkg/encoding/binary/#Read :
So dass Sie nicht verwenden können, slice
[]byte
in Ihre Struktur. Aber Sie können mit fester Größe array für Sie.Wie dieser: Gehen Spielplatz
type T struct { A int16 B int8 }
. Und decodieren beide Teile separatIch denke binpacker wird Super, in diesem Fall behandeln: