convertion valeur hexadecimal en decimal - C - Programmation
Marsh Posté le 05-10-2005 à 14:06:22
demo2000 a écrit : bonjour,
|
Le terme 'lire en décimal' n'a aucun sens.Tu veux lire du binaire, et l'afficher au format décimal.
Citation : |
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 ...)
Marsh Posté le 05-10-2005 à 14:42:21
même avec :
Code :
|
à la place de :
Code :
|
ça marche pas !
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); |
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).
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). |
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.
Marsh Posté le 06-10-2005 à 11:29:36
bonjour,
Merci pour votre aide
voilà ce que j'ai fait :
Code :
|
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 ?
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 ...
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 :
|
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 ?
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
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.
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 :
|
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...
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 ?
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 ....
Marsh Posté le 07-10-2005 à 10:30:52
bin alors mon horreur marche si sizeof(char) == 1 et sizeof(unsigned long) == 4
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.
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 ?
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 ...).
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...
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...
Marsh Posté le 07-10-2005 à 11:40:35
Emmanuel Delahaye a écrit : Ou la la la la...
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.
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
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 ^^
Marsh Posté le 07-10-2005 à 11:44:52
tu fais des sauts partout aussi quand tu codes ?
Marsh Posté le 07-10-2005 à 11:48:10
blackgoddess a écrit : tu fais des sauts partout aussi quand tu codes ? |
J'ai rajouté au fur et a mesure des vérifications , mais c'est vrai qu'un peu de cleanup ferait pas de mal
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.
Marsh Posté le 07-10-2005 à 12:24:20
Emmanuel Delahaye a écrit : n869 : http://mapage.noos.fr/emdel/notes.htm#norme |
Faut que je trouve un moyen pas trop onéreux pour l'imprimer/relier, parceque presque 600 pages quoi
Emmanuel Delahaye a écrit :
Il suffit d'une. Exemple réels : |
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 )...
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).
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 ...
Spoiler : |
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 ?
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 ( et accessoirement, ces merdes ca coute un peu cher pour moi, jvais devoir attendre un peu ... )
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 ... |
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.
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. |
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
Marsh Posté le 05-10-2005 à 13:29:09
bonjour,
voilà mon fichier binaire en hexadecimal :
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 :
la valeur afficher ne convient pas !
Merci