我正在尝试读取一个字节数组并将其输出到Go中的结构中。 official example是一个很好的起点,但这只会解码一个float64
。这个other snippet表明它绝对可以用结构来完成。
但我的play因binary.Read: invalid type ...
而失败。
我认为这与Read函数有关,只接受固定长度数据读入:
binary.Read将结构化二进制数据从r读入数据。数据必须 是指向固定大小值或固定大小值片段的指针
这就是我的struct
定义仅包含固定长度数据的原因。
我无法看到我正在做与工作示例截然不同的任何事情,错误代码在长度问题之外没有多大帮助 - 任何想法?
答案 0 :(得分:2)
你有结构问题,它有未导出的字段。
以下是工作代码:
https://play.golang.org/p/LHTeF-_2lX
package main
import (
"fmt"
"bytes"
"encoding/binary"
"net"
)
type myEvent struct {
IP_version int32
Ipv6_src_addr [16]byte
}
func readFromByteArrayIntoStruct() {
// create event
ip := net.ParseIP("2001::face")
var ipBytes [16]byte;
copy(ipBytes[:], ip.To16())
event := myEvent {
IP_version: 4,
Ipv6_src_addr: ipBytes,
}
// convert to bytes
buf := new(bytes.Buffer)
if err := binary.Write(buf, binary.BigEndian, event); err != nil {
fmt.Println("binary.Write failed:", err)
return
}
eventBytes := buf.Bytes()
fmt.Println(buf.Len(), eventBytes)
// read back the bytes into a new event
reader := bytes.NewReader(eventBytes)
var decodedEvent myEvent
if err := binary.Read(reader, binary.BigEndian, &decodedEvent); err != nil {
fmt.Println("binary.Read failed:", err)
} else {
fmt.Printf("decodedEvent: %+v", decodedEvent)
}
}
func main() {
readFromByteArrayIntoStruct()
}