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



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

恐慌:反思:反思的呼唤。价值数组上的字节值

这是代码

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的字符表示,当我得到恐慌时

想法?

Bytes文档说:

Bytes返回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()))
}

最新更新