如何将二进制文件读入结构和反射 - Go 语言
How to read a binary file into a struct and reflection - Go Language
我正在尝试编写一个程序来将二进制文件读入 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 表示,当我遇到恐慌时
想法?
Bytes 文档说:
Bytes returns v's underlying value. It panics if v's underlying value is not a slice of bytes.
Slice 获取字节切片的数组:
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()))
}
我正在尝试编写一个程序来将二进制文件读入 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 表示,当我遇到恐慌时
想法?
Bytes 文档说:
Bytes returns v's underlying value. It panics if v's underlying value is not a slice of bytes.
Slice 获取字节切片的数组:
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()))
}