Heim  >  Artikel  >  Backend-Entwicklung  >  Lesen Sie Bytes aus der Datei, speichern Sie sie, um Werte zu strukturieren und zu ändern

Lesen Sie Bytes aus der Datei, speichern Sie sie, um Werte zu strukturieren und zu ändern

WBOY
WBOYnach vorne
2024-02-14 15:51:08445Durchsuche

Lesen Sie Bytes aus der Datei, speichern Sie sie, um Werte zu strukturieren und zu ändern

Der PHP-Editor Youzi führt Sie in eine gängige Operation ein, bei der Bytes aus einer Datei gelesen und in einer Struktur gespeichert werden. Außerdem können Sie den Wert der Struktur ändern. Diese Art von Operation kommt in der Programmierung sehr häufig vor, insbesondere beim Umgang mit Binärdateien oder Netzwerkdaten. Indem wir Bytes lesen und in einer Struktur speichern, können wir leicht auf die Daten in der Datei zugreifen und diese ändern und so eine flexible Verarbeitung der Datei erreichen. Als nächstes erklären wir im Detail, wie dieser Prozess implementiert wird, in der Hoffnung, allen zu helfen.

Frageninhalt

Ich bin neu bei Go. Ich habe mir die Coursera-Einführung in die Go-Sprache angesehen, aber einige Themen wurden nicht ausführlich besprochen.

Um Go zu üben, löse ich so viele Übungen wie möglich in CS50. Ich arbeite gerade an einem Beispiel, bei dem ich eine BMP-Datei lesen, den Header-Inhalt in eine entsprechende Datenstruktur kopieren, einige Parameter in dieser Struktur ändern und dann das Ergebnis in eine neue Datei kopieren muss.

Das erste, was mir auffiel, war, dass ich die Anzahl der Bytes, die der Größe der von mir erstellten Struktur entsprach, nicht binär lesen konnte. Dies ist auf die Polsterung zurückzuführen, die beim Aufbau der Struktur auftreten kann. Ich bin in der Lage, die Struktur Feld für Feld zu lesen und zu füllen.

Um dies zu verbessern, habe ich versucht, die Struktur zu iterieren, die Größe jedes Felds zu ermitteln, die entsprechende Anzahl von Bytes aus der Datei zu lesen und dann nach der Iteration der Struktur erneut in die Datei zu schreiben. p>

Ich stecke beim letzten Schritt fest (wenn die vorherigen Schritte korrekt ausgeführt wurden): Wie stellt man den Wert basierend auf dem Feldtyp richtig ein?

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: Vorher habe ich versucht, die Felder in der Struktur direkt zu lesen, aber es ist mir nicht gelungen.

Problemumgehung

Sieht so aus, als würden Sie die Funktionalität in der Funktion binary.Read duplizieren. Diese Funktion dekodiert Daten in der angegebenen Bytereihenfolge in zusammenhängende Felder einer Struktur. Sie können den Strukturdekodierungscode hier einsehen.

So verwenden Sie Read zum Dekodieren von Dateiheadern:

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
}

Das obige ist der detaillierte Inhalt vonLesen Sie Bytes aus der Datei, speichern Sie sie, um Werte zu strukturieren und zu ändern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen