如何将通过网络接收的字节切片转换为结构体?

huangapple go评论122阅读模式
英文:

How to convert byte slice received over network to struct

问题

有没有一个库函数可以将 []byte 转换为 struct?我正在编写一个客户端,用于接收从用 C 编写的服务器发送的 struct。

我已经设置了我的 struct,如下所示:

  1. type mystruct struct {
  2. A uint32
  3. B uint16
  4. }

这是我从网络中读取字节的方式:

  1. var s []byte = make([]byte, 6)
  2. sock.ReadFromUDP(s)
  3. fmt.Println(s)
英文:

Is there a library function to convert a []byte into a struct? I'm working on a client to catch a struct sent from a server written in C.

I have my struct setup like this.

  1. type mystruct struct {
  2. A uint32
  3. B uint16
  4. }

This is how I read the bytes over the wire.

  1. var s []byte = make([]byte, 6)
  2. sock.ReadFromUDP(s)
  3. fmt.Println(s)

答案1

得分: 3

你可以使用encoding/binary包来进行编码和解码操作。根据文档的示例(http://golang.org/pkg/encoding/binary/),你可以按照以下方式使用:

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. )
  7. func main() {
  8. var pi float64
  9. b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
  10. buf := bytes.NewReader(b)
  11. err := binary.Read(buf, binary.LittleEndian, &pi)
  12. if err != nil {
  13. fmt.Println("binary.Read failed:", err)
  14. }
  15. fmt.Print(pi)
  16. }

这段代码将字节切片b解码为一个float64类型的变量pi。解码过程使用了binary.Read函数,并指定了使用LittleEndian字节序。如果解码失败,将会打印错误信息。最后,打印出解码后的pi值。

英文:

You could use encoding/binary.
From the documentation's example: http://golang.org/pkg/encoding/binary/

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. )
  7. func main() {
  8. var pi float64
  9. b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
  10. buf := bytes.NewReader(b)
  11. err := binary.Read(buf, binary.LittleEndian, &pi)
  12. if err != nil {
  13. fmt.Println("binary.Read failed:", err)
  14. }
  15. fmt.Print(pi)
  16. }

答案2

得分: 0

具体来说,对于结构体,代码如下所示。

  1. type mystruct struct {
  2. A uint32
  3. B uint16
  4. }
  5. // ... 网络代码...
  6. var buff []byte = make([]byte, 6)
  7. sock.ReadFromUDP(buff)
  8. var reader = bytes.NewReader(buff)
  9. var str mystruct
  10. binary.Read(reader, binary.LittleEndian, &str)
  11. // 现在 str 中有数据
  12. fmt.Println(str.A)

请注意,这是一个示例代码,用于从UDP套接字读取字节并将其解析为结构体。mystruct 是一个包含 AB 两个字段的结构体类型。binary.Read 函数用于将字节流解析为结构体,并使用小端字节序进行解析。最后,我们可以打印出 str.A 的值。

英文:

Specifically with structs, it would be something like this.

  1. type mystruct struct {
  2. A uint32
  3. B uint16
  4. }
  5. // ... networking code...
  6. var buff []byte = make([]byte, 6)
  7. sock.ReadFromUDP(buff)
  8. var reader = bytes.NewReader(buff)
  9. var str mystruct
  10. binary.Read(reader, binary.LittleEndian, &str)
  11. // now str has things
  12. fmt.Println(str.A)

huangapple
  • 本文由 发表于 2014年7月4日 08:55:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/24565280.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定