Table des matières
Contenu des questions
Solution de contournement
Maison développement back-end Golang Lire les octets du fichier, les enregistrer dans la structure et modifier les valeurs

Lire les octets du fichier, les enregistrer dans la structure et modifier les valeurs

Feb 14, 2024 pm 03:51 PM

Lire les octets du fichier, les enregistrer dans la structure et modifier les valeurs

L'éditeur PHP Youzi vous présentera une opération courante, qui consiste à lire les octets d'un fichier et à les enregistrer dans une structure, et vous pourrez également modifier la valeur de la structure. Ce type d'opération est très courant en programmation, notamment lorsqu'il s'agit de fichiers binaires ou de données réseau. En lisant les octets et en les enregistrant dans une structure, nous pouvons facilement accéder et modifier les données du fichier, obtenant ainsi un traitement flexible du fichier. Ensuite, nous expliquerons en détail comment mettre en œuvre ce processus, dans l’espoir d’aider tout le monde.

Contenu des questions

Je suis nouveau sur Go. J'ai regardé l'introduction de Coursera au langage Go, mais certains sujets n'ont pas été abordés en profondeur.

Pour pratiquer le Go, je résous autant d'exercices en CS50 que possible. Je travaille actuellement sur un exemple dans lequel je dois lire un fichier bmp, copier le contenu de l'en-tête dans une structure de données correspondante, modifier certains paramètres de cette structure, puis copier le résultat dans un nouveau fichier.

La première chose que j'ai remarquée, c'est que je ne parvenais pas à lire en binaire le nombre d'octets correspondant à la taille de la structure que j'avais créée. Cela est dû au rembourrage qui peut se produire lors de la construction de la structure. Je suis capable de lire et de remplir la structure champ par champ.

Pour améliorer cela, j'ai essayé d'itérer la structure, d'obtenir la taille de chaque champ, de lire le nombre d'octets correspondant dans le fichier, puis d'écrire à nouveau dans le fichier après avoir itéré la structure. p>

Je suis bloqué sur la dernière étape (si les étapes précédentes ont été effectuées correctement) : comment définir correctement la valeur en fonction du type de champ ?

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()
}
Copier après la connexion

PS : Avant cela, j'ai essayé de lire directement les champs de la structure, mais je n'y arrivais pas.

Solution de contournement

On dirait que vous dupliquez la fonctionnalité dans la fonction binary.Read. Cette fonction décode les données dans l'ordre d'octet spécifié en champs contigus dans une structure. Vous pouvez voir le code de décodage de la structure ici< /a>.

Voici comment utiliser Read pour décoder les en-têtes de fichiers :

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
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

Comment écrire des fichiers dans GO Language de manière pratique?

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

Comment rédigez-vous des tests unitaires en Go?

See all articles