Maison  >  Article  >  développement back-end  >  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

WBOY
WBOYavant
2024-02-14 15:51:08445parcourir

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()
}

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.

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
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer