Read bytes from file, save them to structure and modify values
php editor Youzi will introduce you to a common operation, which is to read bytes from a file and save them into a structure. You can also modify the structure. value. This kind of operation is very common in programming, especially when dealing with binary files or network data. By reading bytes and saving them into a structure, we can easily access and modify the data in the file, thereby achieving flexible processing of the file. Next, we will explain in detail how to implement this process, hoping to help everyone.
Question content
I am new to Go. I looked at the Coursera introduction to the Go language, but some topics were not discussed in depth.
To practice Go, I'm solving as many exercises in CS50 as I can. I'm working on an example right now where I need to read a bmp file, copy the header content into a corresponding data structure, change some parameters in that structure and then copy the result into a new file.
The first thing I noticed was that I couldn't read in binary the number of bytes corresponding to the size of the structure I created. This is due to padding that may occur when building the structure. I am able to read and populate the structure field by field.
To improve this, I tried iterating the structure, getting the size of each field, reading the corresponding number of bytes from the file, and then writing to the file again after iterating the structure. p>
I'm stuck on the last step (if the previous steps were done correctly): how to set the value correctly based on the field type?
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: Before this, I tried to read the fields in the structure directly, but I couldn't do it.
Workaround
Looks like you are duplicating the functionality in the binary.Read function. This function decodes data in the specified byte order into contiguous fields in a structure. You can view the structure decoding code here< /a>.
Here's how to use Read to decode the file header:
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 }
The above is the detailed content of Read bytes from file, save them to structure and modify values. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

This article explains Go's package import mechanisms: named imports (e.g., import "fmt") and blank imports (e.g., import _ "fmt"). Named imports make package contents accessible, while blank imports only execute t

This article details efficient conversion of MySQL query results into Go struct slices. It emphasizes using database/sql's Scan method for optimal performance, avoiding manual parsing. Best practices for struct field mapping using db tags and robus

This article explains Beego's NewFlash() function for inter-page data transfer in web applications. It focuses on using NewFlash() to display temporary messages (success, error, warning) between controllers, leveraging the session mechanism. Limita

This article explores Go's custom type constraints for generics. It details how interfaces define minimum type requirements for generic functions, improving type safety and code reusability. The article also discusses limitations and best practices

This article demonstrates creating mocks and stubs in Go for unit testing. It emphasizes using interfaces, provides examples of mock implementations, and discusses best practices like keeping mocks focused and using assertion libraries. The articl

This article details efficient file writing in Go, comparing os.WriteFile (suitable for small files) with os.OpenFile and buffered writes (optimal for large files). It emphasizes robust error handling, using defer, and checking for specific errors.

The article discusses writing unit tests in Go, covering best practices, mocking techniques, and tools for efficient test management.

This article explores using tracing tools to analyze Go application execution flow. It discusses manual and automatic instrumentation techniques, comparing tools like Jaeger, Zipkin, and OpenTelemetry, and highlighting effective data visualization
