从文件读取字节,将其保存到结构体并修改值

2024年 2月 14日 56.1k 0

从文件读取字节,将其保存到结构体并修改值

php小编柚子将为大家介绍一种常见的操作,即从文件中读取字节并将其保存到结构体中,同时还可以修改结构体的值。这种操作在编程中非常常见,特别是在处理二进制文件或网络数据时。通过读取字节并将其保存到结构体中,我们可以方便地访问和修改文件中的数据,从而实现对文件的灵活处理。接下来,我们将详细讲解如何实现这一过程,希望对大家有所帮助。

问题内容

我是 Go 的新手。我看了 Coursera Go 语言简介,但有些主题没有深入讨论。

为了练习 Go,我正在尽可能多地解决 CS50 中的练习。我现在正在研究一个例子,我需要读取一个bmp文件,将标题内容复制到相应的数据结构中,更改该结构中的一些参数,然后将结果复制到一个新文件中。

我注意到的第一件事是我无法以二进制形式读取与我创建的结构大小相对应的字节数。这是由于构建结构时可能会发生填充。我能够逐个字段地读取并填充结构。

为了改进这一点,我尝试迭代该结构,获取每个字段的大小,从文件中读取相应的字节数,然后在迭代该结构后再次写入文件。 p>

我陷入了最后一步(如果前面的步骤正确完成):如何根据字段类型正确设置值?

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 登录后复制

PS:在此之前,我尝试直接读取结构体中的字段,但我无法做到这一点。

解决方法

看起来您正在复制 binary.Read 函数中的功能。该函数将指定字节顺序的数据解码为结构中的连续字段。您可以在 此处查看结构体解码代码.

以下是如何使用 Read 来解码文件头:

input_file, err := os.Open("harvard_bottomup.bmp")
if err != nil {
fmt.Println("Could not open the origin file.")
fmt.Println(err)
return
}
defer input_file.Close()
reader := bufio.NewReader(input_file)

var bf BITMAPFILEHEADER
err = binary.Read(reader, binary.BigEndian, &bf)
if err != nil {
fmt.Println(err)
return
}

登录后复制

以上就是从文件读取字节,将其保存到结构体并修改值的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论