2017-08-29 2 views
0

Ich habe zwei Variablen: ein float genannt diff mit einem Wert wie 894077435904.000000 (nicht immer nur mit Null in der Dezimalteil) und ein char[32] die das ist Ergebnis einer Double-Sha256-Berechnung. Ich muss einen Vergleich zwischen ihnen machen (if(hash < diff) { //do someting }), aber dafür muss ich einen zum Typ des anderen umwandeln.Umstellen von Schwimmers auf char [32] (oder umgekehrt) in C

Gibt es eine Möglichkeit, dies zu erreichen? Zum Beispiel, die float in eine char* umwandeln (und strcmp, um den Vergleich zu tun) oder die char* zu float (und mit der oben genannten Ansatz - wenn es überhaupt möglich ist, unter Berücksichtigung der char* ist 256 Bits oder 32 Bytes lang)?

Ich habe versucht, float zu char* wie diese Umwandlung:

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); 

Als ich diff=894077435904.000000 habe ich hex_str=d02b2b00 bekommen. Wie kann ich überprüfen, ob dieser Wert korrekt ist? Mit this converter erhalte ich unterschiedliche Ergebnisse.

+0

Sie müssen die Mathematik tun, die Schwierigkeit zu einem Ziel zu konvertieren und dann müssen Sie das Ziel auf das Hash-Ergebnis vergleichen (wahrscheinlich mit 'memcmp'). Unter [hier] (https://en.bitcoin.it/wiki/Difficulty) erfahren Sie, wie Sie Schwierigkeit in ein Ziel umwandeln können. –

+0

Ich mache diese Mathematik bereits (ich lese die 'Bits' von der json-rpc-Schnittstelle, konvertiere zu' unsigned int' und gehe zu der Funktion, die in dem von Ihnen geposteten Link aufgeführt ist). Jetzt muss ich nur die Schwierigkeit mit dem Hash vergleichen, denke ich. –

+0

Okay. Verwenden Sie 'memcmp' dafür. Wenn der Hash kleiner als das Ziel ist, gewinnen Sie. –

Antwort

3

Es ist sehr detailliert erklärt here.

  1. Erstellen Sie ein Array von 32 unsignierten Bytes, setzen Sie alle seine Werte auf Null.
  2. Extrahieren der oberen Byte aus der Schwierigkeit und subtrahieren, dass von 32
  3. Copy die unteren drei Bytes aus der Schwierigkeit, in das Array ausgehend die Anzahl von Bytes in die Matrix, die in Schritt berechnet 2.
  4. Diese Array enthält jetzt die Schwierigkeit in roher Binärdatei. Verwenden Sie memcmp, um es mit dem Hash in roher Binärdatei zu vergleichen.

Beispielcode:

#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); 
} 

Ausgang:

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