我完全是个新手.我看了Coursera Introduction to Go Language个,但有些话题没有深入讨论.
为了练习围棋,我从CS50开始尽可能多地做练习.我现在正在处理example,我需要在其中读取BMP文件,将头内容复制到相应的数据 struct 中,更改此 struct 中的一些参数,然后将结果复制到新文件中.
我注意到的第一件事是,我不能将与我创建的 struct 的大小相对应的字节数读作二进制.这是由于在构建 struct 时可能发生的填充.我能够逐个字段地读取,并填充了 struct .
为了改进这一点,我试图迭代 struct ,获取每个字段的大小,从文件中读取相应的字节数,然后在迭代 struct 之后再次写入文件.
我陷入了最后一步(如果前面的步骤正确完成的话):我如何才能根据字段类型正确设置值?
package main
import (
"bufio"
"encoding/binary"
"fmt"
"os"
"reflect"
)
type DWORD uint32
type WORD uint16
type BITMAPFILEHEADER struct {
BfType WORD
BfSize DWORD
BfReserved1 WORD
BfReserved2 WORD
BfOffBits DWORD
}
func main() {
input_file, err := os.Open("harvard_bottomup.bmp")
if err != nil {
fmt.Println("Could not open the origin file.")
fmt.Println(err)
}
var bf BITMAPFILEHEADER
reader := bufio.NewReader(input_file)
value := reflect.ValueOf(&bf).Elem()
n := value.NumField()
structType := value.Type()
for i := 0; i < n; i++ {
b := make([]byte, structType.Field(i).Type.Size())
err = binary.Read(reader, binary.BigEndian, b)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Field Name: %-15s %-15s %02x\n", structType.Field(i).Name, structType.Field(i).Type, b)
// I should now set the value, but I don't know how to switch between types
// value.Field(i).Set...
}
input_file.Close()
}
PS:在此之前,我try 直接读取 struct 中的字段,但我做不到.