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

用户3116783

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

恐慌:反映:对数组值调用反射.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 表示,当我感到恐慌时

想法?

宗博

字节文档说

字节返回 v 的基础值。如果 v 的基础值不是字节切片,它会恐慌。

对数组进行切片以获得字节切片:

field := ps.Field(i)
value := field.Slice(0, field.Len()).Bytes()
for j := 0; j < len(value); j++ {
    fmt.Print(value[j])
}

您还可以遍历数组:

value := ps.Field(i)
for j := 0; j < value.Len(); j++ {
    fmt.Print(byte(value.Index(j).Uint()))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章