


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< /a> 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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...
