无法将字节切片解码回struct

时间:2017-11-21 11:47:07

标签: arrays go struct

我正在尝试读取一个字节数组并将其输出到Go中的结构中。 official example是一个很好的起点,但这只会解码一个float64。这个other snippet表明它绝对可以用结构来完成。

但我的playbinary.Read: invalid type ...而失败。

我认为这与Read函数有关,只接受固定长度数据读入:

  

binary.Read将结构化二进制数据从r读入数据。数据必须   是指向固定大小值或固定大小值片段的指针

这就是我的struct定义仅包含固定长度数据的原因。

我无法看到我正在做与工作示例截然不同的任何事情,错误代码在长度问题之外没有多大帮助 - 任何想法?

1 个答案:

答案 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()
}