Conversion hex(ascii) vers float format solar16

Le
Vincent Knecht
Salut

je cherche a convertir des donnees hexadecimales stockees dans
un fichier en mode texte.

J'ai trouvé sur le site : http://cfun.salemioche.com/h2d.htm
/////////////////////
unsigned long hex2dec(char *s, unsigned long d) {
return *s ? hex2dec(s + 1, (d << 4) + *s-'0'-(*s>='A')*7 ) : d;
}

int main (int argc, char **argv) {
printf("%ld", hex2dec(argv[1], 0));
}
/////////////////////
qui a priori ne sait traiter que des entiers

1er pb : je souhaite convertir vers des float, comment
modifier cette fonction ?

2eme pb: le format float utilisé dans le fichier n'est pas conforme a la
description faite ici :
http://www.ifrance.com/jlecomte/c++/c++-faq-lite/misc-technical-issues-fr.html#%5B34.5%5D

qui stipule:
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
(s->signe, e->exposant, m->mantisse)

alors que celui que je dois traiter semble etre stocké comme ceci
smmmmmmmeeeeeeeemmmmmmmmmmmmmmmm

et se nomme SOLAR16

quelqu'un aurait-il des explications, doc, urls sur ce
genre de transformations ?

merci
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
leneuf22
Le #136364
Hello

A priori je ferais comme ça, en très gros :

typedef union { /pour convertir le long en doube (un cast donnerait un
mauvais résultat)
float f_nombre;
unsigned long ui_nombre;
} conversion_t;

conversion_t convert;
fscanf(tonfichier, "%x", &convert.ui_nombre);

//on transforme smmmmmmmeeeeeeeemmmmmmmmmmmmmmmm en
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
convert_ui.nombre = (convert.ui_nombre & 0x8000FFFF) | ((convert.ui_nombre
& 0xFF0000)
printf("le résultat est : %g", convert.f_nombre);



Le Fri, 25 Jul 2003 16:04:59 +0200, Vincent Knecht écrit:

Salut

je cherche a convertir des donnees hexadecimales stockees dans
un fichier en mode texte.

J'ai trouvé sur le site : http://cfun.salemioche.com/h2d.htm
/////////////////////
unsigned long hex2dec(char *s, unsigned long d) {
return *s ? hex2dec(s + 1, (d << 4) + *s-'0'-(*s>='A')*7 ) : d;
}

int main (int argc, char **argv) {
printf("%ldn", hex2dec(argv[1], 0));
}
/////////////////////
qui a priori ne sait traiter que des entiers

1er pb : je souhaite convertir vers des float, comment
modifier cette fonction ?

2eme pb: le format float utilisé dans le fichier n'est pas conforme a la
description faite ici :
http://www.ifrance.com/jlecomte/c++/c++-faq-lite/misc-technical-issues-
fr.html#%5B34.5%5D

qui stipule:
seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
(s->signe, e->exposant, m->mantisse)

alors que celui que je dois traiter semble etre stocké comme ceci
smmmmmmmeeeeeeeemmmmmmmmmmmmmmmm

et se nomme SOLAR16

quelqu'un aurait-il des explications, doc, urls sur ce
genre de transformations ?

merci





--
Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/

leneuf22
Le #136363
Le Fri, 25 Jul 2003 16:48:14 +0200, leneuf22
Hello

A priori je ferais comme ça, en très gros :

typedef union { /pour convertir le long en doube (un cast donnerait un
...



je rectifie : pour convertir le long en float, et pas en double :)

James Kanze
Le #136058
Vincent Knecht
|> je cherche a convertir des donnees hexadecimales stockees dans un
|> fichier en mode texte.

À les convertir en quoi ?

|> J'ai trouvé sur le site : http://cfun.salemioche.com/h2d.htm
|> /////////////////////
|> unsigned long hex2dec(char *s, unsigned long d) {
|> return *s ? hex2dec(s + 1, (d << 4) + *s-'0'-(*s>='A')*7 ) : d;
|> }

Quelle horreur. En plus, le nom ment. Cette fonction convertit une
chaîne de texte hexadécimal en format interne (qui n'est
certainement pas le décimal). À condition qu'il n'y a pas le
moindre erreur dans la chaîne en entrée, et qu'elle est assez
courte. Et que le code caractère soit de l'ASCII, ou un
dérivatif. Et en plus, elle le fait d'une façon
particulièrement peu efficace.

En C++, j'écrirais tout simplement :

std::string
hex2dec( std::string const& source )
{
std::istringstream s( source ) ;
long l ;
s >> std::hex >> l ;
if ( ! s || s.peek() != EOF ) {
throw error... ;
}
std::ostringstream o ;
o << l ;
return o.str() ;
}

C'est peut-être quelque lignes de plus, mais elle marche, et elle
détecte les erreur. Et elle fait ce que dit le nom de la fonction.

|> int main (int argc, char **argv) {
|> printf("%ldn", hex2dec(argv[1], 0));
|> }
|> /////////////////////
|> qui a priori ne sait traiter que des entiers

|> 1er pb : je souhaite convertir vers des float, comment
|> modifier cette fonction ?

D'abord, décris nous ce que tu as exactement en entrée. Ensuite,
décris nous exactement ce que tu veux en sortie. Parce que
convertir une chaîne "A" en 10.0, c'est trivial, mais je ne sais
pas si c'est ce que tu veux.

|> 2eme pb: le format float utilisé dans le fichier n'est pas
|> conforme a la description faite ici :
|> http://www.ifrance.com/jlecomte/c++/c++-faq-lite/misc-technical-issues-fr.html#%5B34.5%5D

|> qui stipule:
|> seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm
|> (s->signe, e->exposant, m->mantisse)

Il ne stipule rien. Il donne un exemple d'un format typique.

|> alors que celui que je dois traiter semble etre stocké comme ceci
|> smmmmmmmeeeeeeeemmmmmmmmmmmmmmmm

|> et se nomme SOLAR16

|> quelqu'un aurait-il des explications, doc, urls sur ce genre de
|> transformations ?

D'abord, est-ce que c'est du texte en hexadécimal, ou est-ce que
c'est du binaire. Ou (ce que je crois) est-ce que c'est du binaire,
dumpé en hexadécimal ? Dans ce dernier cas, la solution est
d'abord de réconvertir le hexadécimal en binaire, puis jouer
avec des bits, en fonction du format interne de la machine qui l'a
généré et du format interne de ta machine.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
kanze
Le #135559
Fabien LE LEZ news:
On 28 Jul 2003 03:09:44 -0700, wrote:

Sans oublier les cas particuliers. Ça m'étonne que tu obtiens la
bonne valeur pour 0, en partant de 0x00800000.


Ben... Si je ne m'abuse, la mantisse est 0, donc quel que soit
l'exposant (0x80 ici), mantisse * pow (...) == 0.


En effet. C'est dans l'autre direction où il faudrait des traitements
spéciaux.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Fabien LE LEZ
Le #132796
On 28 Jul 2003 03:09:44 -0700, wrote:

La fonction ldexp me semble plus indiquée ici.


Je viens de la découvrir, et je confirme ;-)

C'est marrant, il y a quelques années, je croyais que un header totalement indispensable... et pourtant, la première fois
que je l'ai utilisé cette année, c'était il y a deux semaines ;-)


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Publicité
Poster une réponse
Anonyme