convertion valeur hexadecimal en decimal

convertion valeur hexadecimal en decimal - C - Programmation

Marsh Posté le 05-10-2005 à 13:29:09    

bonjour,
voilà mon fichier binaire en hexadecimal :

Citation :


A1 A2 A3 A4  BB DD AA FF


je voudrais lire les 4 premier octet 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 :

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. int main(int argc, char ** argv) {
  5. FILE *infile;
  6. FILE *outfile;
  7. int i=0;
  8.    if ((infile = fopen(argv[1], "rb" )) == NULL)
  9.      {
  10.        fprintf(stderr, "Pb ouverture infile !\n" );
  11.        return(EXIT_FAILURE);
  12.      }
  13.     if(!fread(&i,1,4, infile))
  14.       {
  15.         fprintf(stderr,"fread header Failure !\n" );
  16.         return(EXIT_FAILURE);
  17.       }
  18.     printf("%d\n",i);
  19. return(EXIT_SUCCESS);
  20. }


la valeur afficher ne convient pas !
Merci
 
 
 

Reply

Marsh Posté le 05-10-2005 à 13:29:09   

Reply

Marsh Posté le 05-10-2005 à 14:06:22    

demo2000 a écrit :

bonjour,
voilà mon fichier binaire en hexadecimal :

Citation :


A1 A2 A3 A4  BB DD AA FF


je voudrais lire les 4 premier octet en decimal !


Le terme 'lire en décimal' n'a aucun sens.Tu veux lire du binaire, et l'afficher au format décimal.

Citation :


la valeur du 4 octet en hexa est lu à partir de la fin !
c.à.d :
hex(A4 A3 A2 A1) = ? (decimal)


Possible, ça dépend de la machine (voir 'endianness' ou 'boutisme')
<...>
Si j'ai bien compris, A1 A2 A3 A4 (format réseau) représente un nombre héxa 0xA1A2A3A4, c'est ça ? dans ce ca, il faut définir un entier de taille suffisante :  

unsigned long n = 0;


(un int n'est pas garanti d'avoir la taille suffisante pour 4 octets)
et ranger dedans la valeur numérique de chaque octet (A1 A2 etc) au format 'réseau' (MSB en tete). Pour ça, une lecture 'naturelle' avec fread est possible :  

  fread (&n, 4, 1, fp);


ensuite, il faut convertir la valeur au format 'host :  

  n = ntohl (n);


Les fonction ntoh*() ne sont pas standard C, mais POSIX.1. Ellles sont définit dans les en-têtes 'réseau'
 
Windows : <winsock.h>, <winsock2.h>
Linux : <inet.h> ( ? vérification en cours ...)


Message édité par Emmanuel Delahaye le 05-10-2005 à 14:09:05

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-10-2005 à 14:42:21    

même avec :

Code :
  1. unsigned long i = 0


à la place de :

Code :
  1. int i = 0


ça marche pas !
 

Reply

Marsh Posté le 05-10-2005 à 15:20:07    

La solution d'Emmanuel devrait marcher. Comment a-t-elle été mise en place ? Peut-être que le problème ne vient que de la ligne

printf("%d\\n",i);

qui n'aurait pas été changée en

printf("%ld\\n",i);

:)

Reply

Marsh Posté le 05-10-2005 à 16:03:44    

avec :
 

Citation :

  printf("%ld\n",i);  


il fait la convertion directe.
c.à.d il me donne : le decimal du A1 A2 A3 A4 et non A4 A3 A2 A1 (poids fort/faible).
NB :
sur mon pc (debian avec gcc 3.x) ça marche trés bien (resultat = decimal A4A3A2A1).  
mais dans le serveur (HP-UX avec gcc 2.9.x) il fais la convertion directement sans prendre en consideration le poid fort/faible (resultat = decimal A1A2A3A4).  

Reply

Marsh Posté le 05-10-2005 à 18:09:21    

Citation :

il fait la convertion directe.

printf ne fait pas de conversion, juste un affichage.

Citation :

c.à.d il me donne : le decimal du A1 A2 A3 A4 et non A4 A3 A2 A1 (poids fort/faible).

C'est pour cela qu'il faut utiliser ntohl(), voir
http://msdn.microsoft.com/library/ [...] tohl_2.asp, ou l'inverse htonl().

Citation :

sur mon pc (debian avec gcc 3.x) ça marche trés bien (resultat = decimal A4A3A2A1).  
mais dans le serveur (HP-UX avec gcc 2.9.x) il fais la convertion directement sans prendre en consideration le poid fort/faible (resultat = decimal A1A2A3A4).  

Comme l'a très bien dit Emmanuel, dès la première réponse, l'ordre des octets dépend des machines, c'est normal.


Message édité par olivthill le 05-10-2005 à 18:11:23
Reply

Marsh Posté le 06-10-2005 à 11:29:36    

bonjour,
Merci pour votre aide
voilà ce que j'ai fait :

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. int main(int argc, char ** argv) {
  5. FILE *infile;
  6. char c1=0;
  7. char c2=0;
  8. char c3=0;
  9. char c4=0;
  10. unsigned long int i=0;
  11.    if ((infile = fopen(argv[1], "rb" )) == NULL)
  12.      {
  13.        fprintf(stderr, "Pb ouverture infile !\n" );
  14.        return(EXIT_FAILURE);
  15.      }
  16.     fread(&c1,1,1, infile);
  17.     fread(&c2,1,1, infile);
  18.     fread(&c3,1,1, infile);
  19.     fread(&c4,1,1, infile);
  20.     i=(unsigned int)c4+(unsigned int)c3*256+(unsigned int)c2*256*256+(unsigned int)c1*256*256*256;
  21.     printf("%lu\\n",i);
  22.     return(EXIT_SUCCESS);
  23. }


si dans mon fichier IN j'ai :

Citation :

90 02 00 00 // valeur en hex


résultat :

Citation :

2416050176 // valeur en decimal de 90 02 00 00 et non 00 00 02 90 !!


 
alors le problème persiste toujours !!
 
est ce qu'il y a une methode qui garantie le resultat sans prendre compte de la machine ?

Reply

Marsh Posté le 06-10-2005 à 12:48:24    

oui c'est normal vu que n'a pas utiliser les fonctions que l'on t'as conseillé ...
 
ntohl/htonl ...

Reply

Marsh Posté le 06-10-2005 à 13:33:53    

demo2000 a écrit :

est ce qu'il y a une methode qui garantie le resultat sans prendre compte de la machine ?

Quels sont les mots que tu ne comprends pas dans :

Citation :

ensuite, il faut convertir la valeur au format 'host :  

 n = ntohl (n);



Message édité par Emmanuel Delahaye le 06-10-2005 à 13:34:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-10-2005 à 13:58:24    

mmh si le format reseau et le format de la machine ont le meme endian (big endian je crois ?) ntohl/htonl seront inefficaces non ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 06-10-2005 à 13:58:24   

Reply

Marsh Posté le 06-10-2005 à 14:40:36    

blackgoddess a écrit :

mmh si le format reseau et le format de la machine ont le meme endian (big endian je crois ?) ntohl/htonl seront inefficaces non ?


Il feront ce qu'ils ont à faire. C'est le principe du code portable...
 
Exemple d'implémentation (pas très sioux...)
http://mapage.noos.fr/emdel/clib.htm
Module HTON


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-10-2005 à 15:01:14    

pour etre sur inverser les octets on peut faire un super bricolage de ce genre :
 
unsigned long inverser_octets(unsigned long val)
{
   int i;
   unsigned long ret;
   for(i=0; i<4; i++)
      ((char*)&ret)[i] = ((char*)&val)[3-i];
   return ret;
}
 
oui c'est tres moche.
[:al bundy]


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 06-10-2005 à 15:33:36    

blackgoddess a écrit :

pour etre sur inverser les octets on peut faire un super bricolage de ce genre :


unsigned long inverser_octets(unsigned long val)
{
   int i;
   unsigned long ret;
   for(i=0; i<4; i++)
      ((char*)&ret)[i] = ((char*)&val)[3-i];
   return ret;
}


oui c'est tres moche.


Oui, à cause des casts. Mais ce n'est pas un hasard.  
 
Comme souvent, un cast rend le code non portable, et c'est évidemment le cas ici, car un char ne fait pas forcément un octet (c'est à dire 8 bits). C'est pourquoi il faut utiliser le mécanisme du shift (>>, << ) de n x 8 bits comme je l'ai indiqué dans mon lien...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 10:12:15    

un char ne fait pas forcement un octet ? je croyais que sizeof(char) retournait forcément 1 ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-10-2005 à 10:23:04    

Le char fait forcément 1 octet,  mais c'est l'octet qui fait pas forcément 8bits ( pb de traduction francaise), enfin c'est marqué dans la spec dumoins... après des machins non-8bits/octet ....


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 10:30:52    

bin alors mon horreur marche si sizeof(char) == 1 et sizeof(unsigned long) == 4


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-10-2005 à 10:39:35    

blackgoddess a écrit :

bin alors mon horreur marche si sizeof(char) == 1 et sizeof(unsigned long) == 4


Par définition, comme toute unité dans n'importe domaine, sizeof(char) vaut toujours 1. (Le 'char' ou 'byte' est l'unité de mesure de la grandeur 'mémoire').
Par contre la valeur de sizeof(unsigned long) dépend de la machine. Ca peut très bien faire 1 avec un long de 32 bits. Ca dépend de la valeur de CHAR_BIT.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 10:44:37    

donc (si j'ai bien compris le raisonnement), char est de la taille d'une unité mémoire, et long est de 32 bits. mais une unité mémoire a une taille variable, CHAR_BIT. C'est ca ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-10-2005 à 10:47:03    

blackgoddess a écrit :

un char ne fait pas forcement un octet ? je croyais que sizeof(char) retournait forcément 1 ?

Ben oui, quel rapport ?
 
1 dollar vaut 1, mais il vaut aussi de 0.80 à 1.25 euros selon les jours... Faut pas se tromper d'unité de compte...
de même
1 byte (ou char) vaut 1, mais il peut valoir (par exemple) 1, 2, 4, 8, 9, 16, 32, 36 bits selon la machine... Le C exige un minimum de 8.
 
Un octet désigne une valeur de exactement 8 bits (soit une plage de 0-255 en non signé). On utilise ce format en telecom pour transmettre des données élémentaires dans les protocoles orientés octets (asynchrone, ATM ...).


Message édité par Emmanuel Delahaye le 07-10-2005 à 10:58:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 10:54:02    

0x90 a écrit :

Le char fait forcément 1 octet

Ou la la la la...  
 
Non. Un char fait au moins 8 bits.

Citation :

,  mais c'est l'octet qui fait pas forcément 8bits

Eeek! Un octet (de 'octo' = 8) fait exactement 8 bits. Toujours, partout. Ne pas confondre les mots anglais 'octet' et 'byte'. Rien à voir. 'byte' (en français 'multiplet', quel vilain mot...) désigne en C le plus petit espace mémoire adressable >= 8 bits d'une architecture donnée.

Citation :

( pb de traduction francaise), enfin c'est marqué dans la spec dumoins... après des machins non-8bits/octet ....

Punaise, c'est quoi ce charabia...

Message cité 1 fois
Message édité par Emmanuel Delahaye le 07-10-2005 à 10:59:02

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 10:56:38    

blackgoddess a écrit :

donc (si j'ai bien compris le raisonnement), char est de la taille d'une unité mémoire,

Oui.

Citation :

et long est de 32 bits.

au minimum.

Citation :

mais une unité mémoire a une taille variable, CHAR_BIT.

disons qu'elle dépend de l'implémentation.

Citation :

C'est ca ?

On va dire oui, à un poil de grenouille près...


Message édité par Emmanuel Delahaye le 07-10-2005 à 10:57:09

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 11:40:35    

Emmanuel Delahaye a écrit :

Ou la la la la...  
 
Non. Un char fait au moins 8 bits.

Citation :

,  mais c'est l'octet qui fait pas forcément 8bits

Eeek! Un octet (de 'octo' = 8) fait exactement 8 bits. Toujours, partout. Ne pas confondre les mots anglais 'octet' et 'byte'. Rien à voir. 'byte' (en français 'multiplet', quel vilain mot...) [désigne en C le plus petit espace mémoire adressable >= 8 bits d'une architecture donnée.

Citation :

( pb de traduction francaise), enfin c'est marqué dans la spec dumoins... après des machins non-8bits/octet ....

Punaise, c'est quoi ce charabia...


 
Arf, j'ai retrouvé la référence qui parlait de ca ( dumoins la ou je l'ai lut )
c'est dans le "C précis&concis" (p.9 pour les curieux ) , une Note du Traducteur en bas:
[quote]
L'usage veut que l'on traduise en francais le terme byte par octet. Il ne faudra toutefois pas oublier que cela ne signifie pas toujours 8bits.
 
D'ailleurs ( bon ca vient du net donc pas forcément aussi fiable qu'un vrai dico ) octet désigne en anglais un groupe de 8élements ( des gens en musique dans un sens, d'autres trucs divers dans un autre ) mais pas de 8bits spécifiquement : http://www.wordreference.com/definition/octet
C'est la définition de byte qui donne 8bits spécifiquement*, alors que dans un dico francais octet signifie bien 8bits.
Et quand on demande un peu partout la traduction de byte, on trouve octet et pas multiplet [:spamafote]
 
Cf. le machin en vert : je voulais dire octet dans le sens "traduction FR de byte", et pas 8bits ;)
 
Cf. le machin souligné : Je suppose que ca vient de la mégaspec n68kkchose qui traine dans tes chiottes ^^ il faudrait que je l'imprime, le K&R est vachement moins précis que ca :/
 
* Et la ca dépends suivant les sources et leur sérieux on trouve spécifiquement 8bits, usually 8bits, "suffisemment de bits pour représenter un caractère" , Si on recherche dans l'histoire de l'informatique on trouve des bytes à 6 ou 7 bits, voire des machines a bytes variables (brr...)
 
PS : c'est quand même vachement plus simple de parler en anglais ( a défaut d'avoir multiplet courament utilisé )
 
PS² : 'fin bon, on est en 2005, les plateformes pas-8bits/byte y'en as pas des masses, c'est vraiment histoire de se faire chier ces détails ^^


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 11:44:52    

tu fais des sauts partout aussi quand tu codes ? :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-10-2005 à 11:48:10    

blackgoddess a écrit :

tu fais des sauts partout aussi quand tu codes ? :p


 
J'ai rajouté au fur et a mesure des vérifications [:spamafote], mais c'est vrai qu'un peu de cleanup ferait pas de mal :whistle:


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 12:15:20    

0x90 a écrit :

Cf. le machin souligné : Je suppose que ca vient de la mégaspec n68kkchose qui traine dans tes chiottes ^^ il faudrait que je l'imprime, le K&R est vachement moins précis que ca :/

n869 : http://mapage.noos.fr/emdel/notes.htm#norme
 
(laisse mes chiottes tranquilles)

Citation :

PS² : 'fin bon, on est en 2005, les plateformes pas-8bits/byte y'en as pas des masses, c'est vraiment histoire de se faire chier ces détails ^^

Il suffit d'une. Exemple réels :  
 
DSP FreeScale (ex-Motorola) 56156 : CHAR_BIT vaut 32
DSP Texas Instrument TMS320C54 : CHAR_BIT vaut 16
 
etc.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 07-10-2005 à 12:16:00

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 12:24:20    


Faut que je trouve un moyen pas trop onéreux pour l'imprimer/relier, parceque presque 600 pages quoi :/
 

Emmanuel Delahaye a écrit :


Citation :

PS² : 'fin bon, on est en 2005, les plateformes pas-8bits/byte y'en as pas des masses, c'est vraiment histoire de se faire chier ces détails ^^

Il suffit d'une. Exemple réels :  
 
DSP FreeScale (ex-Motorola) 56156 : CHAR_BIT vaut 32
DSP Texas Instrument TMS320C54 : CHAR_BIT vaut 16
 
etc.


Voui ca existe c'est clair, mais faut remettre ca en perspective, les gens qui codent la dessus on pas le même niveau de compétence que le topic en question, et ce genre de trucs est noté dans la doc qu'on lit avant de coder la dessus ( enfin je l'espère )...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 12:41:45    

0x90 a écrit :

Faut que je trouve un moyen pas trop onéreux pour l'imprimer/relier, parceque presque 600 pages quoi :/


Aucun interêt. Télécharge le PDF. Utilise les fonctions de recherche de Acrobat Reader. Rien de plus pratique (et de plus écolo).


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 19:39:00    

Emmanuel Delahaye a écrit :

Aucun interêt. Télécharge le PDF. Utilise les fonctions de recherche de Acrobat Reader. Rien de plus pratique (et de plus écolo).


 
Les Pdf c'est sympa certes pour la recherche mais c'est pas pratique à lire dans le tram :/ j'aime bien avoir un format papier, justement parceque je lis surtout quand j'ai pas le pc sous la main ou que je peut pas le sortir [:spamafote] ...
 
 
 
 
 

Spoiler :


( rha chuis naif, je pensais vraiment que tu l'avais imprimé pour mettre dans tes chiottes )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 20:03:47    

0x90 a écrit :

Les Pdf c'est sympa certes pour la recherche mais c'est pas pratique à lire dans le tram


Un mini-portable genre Vaio Sony, c'est cool pour ça, non ?


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 20:16:01    

toutes les merdes en plastiques et metaux lourds qui traine dedans ca casse le coté écolo :ange: ( et accessoirement, ces merdes ca coute un peu cher pour moi, jvais devoir attendre un peu ... )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 10-10-2005 à 21:40:27    

0x90 a écrit :

Les Pdf c'est sympa certes pour la recherche mais c'est pas pratique à lire dans le tram :/ j'aime bien avoir un format papier, justement parceque je lis surtout quand j'ai pas le pc sous la main ou que je peut pas le sortir [:spamafote] ...
[/spoiler]


Parce que tu comptes te promener avec tes 600 pages ? Remarque, avec 2 pp/feuille en recto-verso, ça fait "que" 150 feuilles. Et ça doit être pas mal pour la sieste dans le métro. [:itm]


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 10-10-2005 à 21:58:29    

el muchacho a écrit :

Parce que tu comptes te promener avec tes 600 pages ? Remarque, avec 2 pp/feuille en recto-verso, ça fait "que" 150 feuilles. Et ça doit être pas mal pour la sieste dans le métro. [:itm]


 
Un "Initiation a l'algorithmique" ou un Taocp c'est pas franchement plus petit à lire, et j'exclue pas le fait de l'imprimer en plusieurs bouts ;)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed