Forum Programmation.c convertion valeur hexadecimal en decimal

Posté par  .
Étiquettes : aucune
0
5
oct.
2005
bonjour,
voilà mon fichier binaire en hexadecimal :

A1 A2 A3 A4 BB DD AA FF

je voudrais lire les 4 premier octet (ecrit en hexadecimal), en decimal !
la valeur du 4 octet en hexa est lu à partir de la fin !
c.à.d :
hex(A4 A3 A2 A1) = ? (decimal)
voilà ou je suis :

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char ** argv) {
FILE *infile;
FILE *outfile;
int i=0;
if ((infile = fopen(argv[1], "rb")) == NULL)
{
fprintf(stderr, "Pb ouverture infile !\n");
return(EXIT_FAILURE);
}
if(!fread(&i,1,4, infile))
{
fprintf(stderr,"fread header Failure !\n");
return(EXIT_FAILURE);
}
printf("%d\n",i);
return(EXIT_SUCCESS);
}

la valeur afficher ne convient pas !
Merci
  • # boutisme

    Posté par  . Évalué à 5.

    Ton fichier est petit boutiste mais ton système ne l'est pas (sparc ? 68000 ?). Donc :

    char b[4];
    fread(b, 1, 4, infile);
    int i = b[3]<<24 | b[2]<<16 | b[1] << 8 | b[0];

    Ce que tu as fais correspond à ça :

    union {
    char b[4];
    int i;
    } u;
    fread(u.b, 1, 4, infile);
    int i = u.i;

    Lire les octets dans l'ordre puis croire que c'est le même ordre en mémoire pour un int. Cela ne fonctionne pas sur un système gros boutiste (ni sur un biboutiste (arm, ppc, ia64)).

    Tu peux tester avec #ifdef __LITTLE_ENDIAN.
    Sinon, il vaut mieux utiliser les fonctions htonl et consorts qui convertissent proprement un long (32 bits) vers et depuis le format « réseau ». Voir 'man byteorder'.
    • [^] # Re: boutisme

      Posté par  . Évalué à 3.

      Un petit conseil pour le débuggage de ton pb, un printf ("%x\n", i); en plus de ton printf ("%d\n", i) te permets de voir la valeur que t'as lue en hexa, ça peut donner des idées pour comprendre ce qui ne va pas des fois (dans ton cas, t'as probablement les bons chiffres en hexa dans ta variable, mais pas dans le bon ordre comme dit dans le commentaire précédent).
    • [^] # Re: boutisme

      Posté par  (site web personnel) . Évalué à 3.

      Attention, supposer que long fait quatre octets n'est pas portable...
      • [^] # Re: boutisme

        Posté par  . Évalué à 3.

        Exact.
        J'ai mis « long » à cause du nom des fonctions (htonl = host to network long). J'ai mis le 32 bits entre parenthèses pour indiquer que ces fonctions prennent en fait des entiers non signés sur 32 bits, donc pour dire qu'ici, le long du nom est à comprendre comme uint32, pas pour dire qu'un long fait toujours 32 bits.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.