为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
尚方宝剑之说 2022-11-23 20:37:40
我正在尝试编写一个程序来将二进制文件读入 golang 中的结构,方法是使用二进制包读取二进制文件以填充包含数组的结构,我使用的是数组而不是切片,因为我想指定字段长度,这似乎工作正常但是当我尝试使用反射来打印我们的字段值时出现此错误恐慌:反映:对数组值调用 reflect.Value.Bytes这是代码package mainimport (    "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 mainimport (    "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 表示,当我感到恐慌时想法?
查看完整描述

1 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

字节文档说:

字节返回 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()))

}


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 76 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信