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 Sylvain Sauvage . Évalué à 5.
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 Christophe Fergeau . Évalué à 3.
[^] # Re: boutisme
Posté par Jean Bréfort (site web personnel) . Évalué à 3.
[^] # Re: boutisme
Posté par Sylvain Sauvage . Évalué à 3.
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.