如何将二进制文件读入结构和反射 - Go 语言

我正在尝试编写一个程序来将二进制文件读入 golang 中的结构,方法是使用二进制包读取二进制文件以填充包含数组的结构,我使用的是数组而不是切片,因为我想指定字段长度,这似乎工作正常但是当我尝试使用反射来打印我们的字段值时出现此错误


恐慌:反映:对数组值调用 reflect.Value.Bytes


这是代码


package main


import (

    "encoding/binary"

    "fmt"

    "log"

    "os"

    "reflect"

)


type SomeStruct struct {

    Field1                     [4]byte

    Field2                  [2]byte

    Field3                [1]byte


}


func main() {

    f, err := os.Open("/Users/user/Downloads/file.bin")

    if err != nil {

        log.Fatalln(err)

    }

    defer f.Close()


    s := SomeStruct{}

    err = binary.Read(f, binary.LittleEndian, &s)


    numOfFields := reflect.TypeOf(s).NumField()

    ps := reflect.ValueOf(&s).Elem()


    for i := 0; i < numOfFields; i++ {

        value := ps.Field(i).Bytes()

        for j := 0; j < len(value); j++ {

            fmt.Print(value[j])

        }

    }

}

当我将代码更改为此


package main


import (

    "encoding/binary"

    "fmt"

    "log"

    "os"

    "reflect"

)


type SomeStruct struct {

    Field1 [4]byte

    Field2 [2]byte

    Field3 [1]byte

}


func main() {

    f, err := os.Open("/Users/user/Downloads/file.bin")

    if err != nil {

        log.Fatalln(err)

    }

    defer f.Close()


    s := SomeStruct{}

    err = binary.Read(f, binary.LittleEndian, &s)


    numOfFields := reflect.TypeOf(s).NumField()

    ps := reflect.ValueOf(&s).Elem()


    for i := 0; i < numOfFields; i++ {

        value := ps.Field(i)

        fmt.Print(value)


    }

}



它打印带有 ascii 表示的数组,我需要打印 ascii 的 char 表示,当我感到恐慌时

想法?



尚方宝剑之说
浏览 83回答 1
1回答

MYYA

字节文档说:字节返回 v 的基础值。如果 v 的基础值不是字节片段,它会发生恐慌。对数组进行切片以获得字节切片:field := ps.Field(i)value := field.Slice(0, field.Len()).Bytes()for j := 0; j < len(value); j++ {&nbsp; &nbsp; fmt.Print(value[j])}您还可以遍历数组:value := ps.Field(i)for j := 0; j < value.Len(); j++ {&nbsp; &nbsp; fmt.Print(byte(value.Index(j).Uint()))}
打开App,查看更多内容
随时随地看视频慕课网APP