Deplacement pour Lire la table BPB et FAT32

Résolu
peachesncream Messages postés 16 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
à l’intérieur d'une partition je veux lire les différentes tables afin d'extraire les informations qui me permettent de calculer les différentes adresses, par exemple je dois accéder et lire le BIOS parameters Bock BPB pour récupérer le nombre de secteur dans la région réservée, le nombre de FAT. J'ai trouvé quelques difficultés, pour lire cette table je dois me positionner dans le fichier et donc j'utilise fseek mais j'ai pas su comment écrire le déplacement.
Est-ce que en faisant fopen("/dev/sda1","rb"); je ne calcule pas le deplacement à partir du MBR?
quand je fait fseek(F,512,SEEK_SET); le 512 c'est par rapport à la taille du BOOT seulement?
Et aussi comme tout est en octet donc comment est-ce que je peux lire des valeurs en octet ? voici ma partie du code, l'execution de cette partie m'affiche des resultats qui ne sont pas correctes, par exemple lorsque j'affiche buffer[16] cela me donne 222 alors que nomralement ça doit être 2
Pour le code je suis obligé d'utiliser fopen et fseek ...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char * argv[])
{
int nb_secteurRR =0; //number of sectors in the saved region
unsigned char buffer[512];
FILE* F = NULL;
int i,s;
F = fopen("/dev/sda1", "rb");
s = fseek(F, 512*2, SEEK_SET);
i = fread(buffer, 512,1,F);
int nb_secteurRR = buffer[14]; // here i wante to get the number of sectors in the saved region in the BPB table it's on offset 14 but i need to read 2 bytes not only one its size is 2.
printf("The value of nb_secteur is %d\n",nb_secteurRR);
return 0;

}

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut peachesncream,

    Dans la mesure où tu connais le format des données binaires que tu lis et leur type, tu peux créer une
    struct
    qui réplique ce format et lire le bloc de données avec
    fread
    dans une variable de ce type
    struct
    . Tu pourras ensuite accéder aux données contenues dans les champs de la variable
    struct
    .

    Ou alors, par exemple, si tu n'es intéressé que par un
    uint16_t
    dont tu connais la déplacement par rapport au début, tu fais un
    fseek
    jusqu'à l'emplacement concerné et tu lis ton
    uint16_t
    présent à cet endroit avec
    fscanf
    .

    Les spécificateurs de format pour
    scanf
    et
    printf
    pour un type
    uint16_t
    sont définis dans l'entête standard
    <inttypes.h>
    .

    https://en.cppreference.com/w/c/types/integer

    Dal
    1
    1. ElementW Messages postés 5690 Statut Contributeur 1 293
       
      et tu lis ton
      uint16_t
      présent à cet endroit avec
      fscanf
      .
      Non non non non non,
      fscanf
      c'est pour la lecture de données depuis des fichiers texte ! Dans son cas il ne faut utiliser que
      fread
      .
      0
      1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108 > ElementW Messages postés 5690 Statut Contributeur
         
        Salut ElementW,

        Bien que le standard ne le dise pas explicitement, je pense que tu as raison, vu que
        fscanf
        fonctionne exactement de la même façon que
        scanf
        avec
        stdin
        . D'ailleurs les exemples présents dans le standard pour
        fscanf
        utilisent
        stdin
        en premier argument.

        Merci de ton intervention :-)
        0