Home  >  Article  >  Backend Development  >  Read bytes from file, save them to structure and modify values

Read bytes from file, save them to structure and modify values

WBOY
WBOYforward
2024-02-14 15:51:08445browse

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.

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete