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

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

How to convert byte slice received over network to struct

问题

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

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

type mystruct struct {
    A   uint32
    B   uint16
}

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

var s []byte = make([]byte, 6)
sock.ReadFromUDP(s)
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.

type mystruct struct {
    A   uint32
    B   uint16
}

This is how I read the bytes over the wire.

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

答案1

得分: 3

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

package main

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

func main() {
	var pi float64
	b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
	buf := bytes.NewReader(b)
	err := binary.Read(buf, binary.LittleEndian, &pi)
	if err != nil {
		fmt.Println("binary.Read failed:", err)
	}
	fmt.Print(pi)
}

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

英文:

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

package main

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

func main() {
	var pi float64
	b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}
	buf := bytes.NewReader(b)
	err := binary.Read(buf, binary.LittleEndian, &pi)
	if err != nil {
		fmt.Println("binary.Read failed:", err)
	}
	fmt.Print(pi)
}

答案2

得分: 0

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

type mystruct struct {
    A   uint32
    B   uint16
}

// ... 网络代码...

var buff []byte = make([]byte, 6)
sock.ReadFromUDP(buff)

var reader = bytes.NewReader(buff)   
var str mystruct
binary.Read(reader, binary.LittleEndian, &str)

// 现在 str 中有数据
fmt.Println(str.A)

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

英文:

Specifically with structs, it would be something like this.

type mystruct struct {
    A   uint32
    B   uint16
}

// ... networking code...

var buff []byte = make([]byte, 6)
sock.ReadFromUDP(buff)

var reader = bytes.NewReader(buff)   
var str mystruct
binary.Read(reader, binary.LittleEndian, &str)

// now str has things
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:

确定