2017-08-29 2 views
0

J'ai deux variables: une float nommée diff avec une valeur comme 894077435904.000000 (pas toujours seulement avec zéro dans la partie décimale) et un char[32] qui est la résultat d'un calcul double-sha256. J'ai besoin de faire une comparaison entre eux (if(hash < diff) { //do someting }), mais pour cela, j'ai besoin de convertir l'un au type de l'autre.Conversion du flotteur char [32] (ou vice-versa) en C

Existe-t-il un moyen d'accomplir ceci? Par exemple, la conversion du float à un char* (et en utilisant strcmp faire la comparaison) ou char* à float (et en utilisant l'approche ci-dessus - s'il est même possible, compte tenu de la char* est de 256 bits ou 32 octets)?

J'ai essayé de convertir float à char* comme ceci:

char hex_str[2*sizeof(diff)+1]; 
snprintf(hex_str, sizeof(hex_str), "%0*lx", (int)(2*sizeof diff), (long unsigned int)diff); 
printf("%s\n", hex_str); 

Quand j'ai diff=894077435904.000000 j'obtenir hex_str=d02b2b00. Comment puis-je vérifier si cette valeur est correcte? En utilisant this converter j'obtiens des résultats différents.

+0

Vous devez faire le calcul pour convertir la difficulté à une cible, puis vous devez comparer la cible au résultat de hachage (probablement avec 'memcmp'). Voir [ici] (https://en.bitcoin.it/wiki/Difficulty) pour en savoir plus sur la façon de convertir la difficulté en cible. –

+0

Je fais déjà ce calcul (je lis les bits de l'interface json-rpc, je les convertis en 'unsigned int' et je passe à la fonction listée dans le lien que vous publiez). Maintenant, j'ai juste besoin de comparer la difficulté avec le hachage, je suppose. –

+0

D'accord. Utilisez 'memcmp' pour cela. Si le hash est inférieur à la cible, vous gagnez. –

Répondre

3

Il est expliqué en détail here.

  1. Créez un tableau de 32 octets non signés, définissez toutes ses valeurs sur zéro.
  2. Extrait l'octet haut de la difficulté et soustrayez de 32.
  3. Copiez les trois octets en bas de la difficulté dans le tableau, en commençant le nombre d'octets dans le tableau que vous calculé à l'étape 2.
  4. Cette array contient maintenant la difficulté en binaire brut. Utilisez memcmp pour le comparer au hachage en binaire brut.

code Exemple:

#include <stdio.h> 
#include <string.h> 

char* tohex="ABCDEF"; 

void computeDifficulty(unsigned char* buf, unsigned j) 
{ 
    memset(buf, 0, 32); 
    int offset = 32 - (j >> 24); 
    buf[offset] = (j >> 16) & 0xffu; 
    buf[offset + 1] = (j >> 8) & 0xffu; 
    buf[offset + 2] = j & 0xffu; 
} 

void showDifficulty(unsigned j) 
{ 
    unsigned char buf[32]; 
    computeDifficulty(buf, j); 
    printf("%x -> ", j); 
    for (int i = 0; i < 32; ++i) 
     printf("%c%c ", tohex[buf[i] >> 4], tohex[buf[i] & 0xf]); 
    printf("\n"); 
} 

int main() 
{ 
    showDifficulty(0x1b0404cbu); 
} 

Sortie:

1b0404cb -> 00 00 00 00 00 04 04 CB 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00