double hex string & hex corde à double
Ce que je suis en train de faire est de convertir un double en chaîne hexadécimale et puis de nouveau à double.
Le code suivant effectue la conversion double-chaîne hexadécimale.
char * double2HexString(double a)
{
char *buf = new char[17]; //double is 8-byte long, so we have 2*8 + terminating char * double2HexString(double a)
{
char *buf = new char[17]; //double is 8-byte long, so we have 2*8 + terminating \0
char *d2c;
d2c = (char *) &a;
char *n = buf;
int i;
for(i = 0; i < 8; i++)
{
sprintf(n, "%02X", *d2c++);
n += 2;
}
*(n) = '\0';
}
char *d2c;
d2c = (char *) &a;
char *n = buf;
int i;
for(i = 0; i < 8; i++)
{
sprintf(n, "%02X", *d2c++);
n += 2;
}
*(n) = 'char * double2HexString(double a)
{
char *buf = new char[17]; //double is 8-byte long, so we have 2*8 + terminating \0
char *d2c;
d2c = (char *) &a;
char *n = buf;
int i;
for(i = 0; i < 8; i++)
{
sprintf(n, "%02X", *d2c++);
n += 2;
}
*(n) = '\0';
}
';
}
Cela semble fonctionner, cependant, je ne suis pas sûr de la façon de convertir la chaîne résultante arrière à double.
Veuillez informer 🙂
- Êtes-vous en train d'imprimer les octets brutes, ou l'hexadécimal de la représentation du nombre? Aussi, à faire vous vous souciez de la portabilité de la chaîne elle-même (pas le code)?
- Préférez-vous une solution qui est portable, facile à code/lire, ou rapide?
- Je préfère la solution qui est facile à coder et à lire. J'ai besoin de cela pour passer des arguments entre les programmes. Être plus précis, premier programme engendre l'autre et passe à 2 doubles codé en hexadécimal de la chaîne. Strager, qu'entendez-vous par "la portabilité de la chaîne elle-même"?
- La portabilité peut être un problème si vous utilisez cette sur deux HW plattforms parce que vous utilisez la forme binaire de données. Big Endian/Little Endian machine, ordre des octets de Réseau et ces choses doivent être prises en compte.
Vous devez vous connecter pour publier un commentaire.
Je suis surpris de voir que personne n'a trouver la solution standard, qui est la
%a
spécificateur de format ISO Standard C99.long double
.double
et pas pourlong double
. Si vous désirez le faire pourlong double
, vous avez besoin de la"%LA"
indicateur de conversion. Vous pouvez upvote ma réponse maintenant.Cette utilise le non-standard
hh
modificateur. Si vous ne voulez pas l'utiliser, utilisation:Pour MFC, convertir double de CString 🙂
-345.86783907228863 -> "-159.DE2" (beforKomma=3)
En utilisant sprintf est lent, pour être honnête, mais vous pouvez revenir avec sscanf, faisant presque exactement la même chose.
Eh bien, en fait, vous devez copier tous les deux des caractères dans un tampon de chaîne, à décoder chacun individuellement. Mon premier essai, ci-dessous est incorrect:
Vous voyez, %X est décodé comme un int, pas comme un octet. Il pourrait même travail, en fonction sur le bas de la fin/haute-endian questions, mais en gros, c'est cassé. Alors, nous allons essayer de contourner:
De limitation des erreurs de syntaxe et d', je pense que cela devrait fonctionner.
Presque la même procédure doit faire
Rapide & sale.
Noter, cependant, que c'est jouer avec le feu. Tout d'abord, votre hex chaînes sont utilisables uniquement sur les machines avec le double même format et la même boutisme. Deuxièmement, les fonctions de conversion sont courts sur le strict aliasing règle.
Peut-être pas la solution la plus efficace, mais le plus facile à coder.
Vous souhaitez utiliser une union et d'éviter cette mauvaise habitude:
char *d2c;
d2c = (char *) &a;
Pour juste l'impression ce n'est pas mauvais, son lorsque vous essayez de modifier d2c et ensuite utiliser un est quand vous avez des ennuis. (même chose est vraie pour tous les deux variables ou des pointeurs (ou tableaux) partage le même (théorique) de la mémoire.
Je suis ci-dessous à l'aide de la fonction de convertir un double en hexadécimal.
passant 1.0 & 16.0 à cette fonction, le retour aux valeurs observées sont 000000000000FF37 & 0000000000003040 respectivement. Je pense que nous devrions obtenir 1 & 10.