首頁 > 後端開發 > Golang > 主體

從文件讀取字節,將其保存到結構體並修改值

WBOY
發布: 2024-02-14 15:51:08
轉載
489 人瀏覽過

從文件讀取字節,將其保存到結構體並修改值

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 < 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:在此之前,我嘗試直接讀取結構體中的字段,但我無法做到這一點。

解決方法

看起來您正在複製 binary.Read 函數中的函數。此函數將指定位元組順序的資料解碼為結構中的連續欄位。您可以在 此處查看結構體解碼程式碼< /a>.

以下是如何使用 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
}
登入後複製

以上是從文件讀取字節,將其保存到結構體並修改值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板