Wie man float-bytes?

Ich bin mit dem HIDAPI, um Daten zu senden, um ein USB-Gerät. Diese Daten können nur gesendet werden als byte-array und muss ich senden Sie ein paar float-zahlen in diesem array. Ich weiß, schwimmt 4 bytes, also dachte ich, das könnte funktionieren:

float f = 0.6;
char data[4];

data[0] = (int) f >> 24;
data[1] = (int) f >> 16;
data[2] = (int) f >> 8;
data[3] = (int) f;

Und später alles was ich zu tun hatte, war:

g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]) );

Aber testen das zeigt mir, dass die Zeilen wie data[0] = (int) f >> 24; gibt immer 0. Was ist Los mit meinem code und wie mache ich das richtig (d.h. brechen Sie ein Schwimmer innere Daten in 4 char Byte und Wiederaufbau die gleiche float später)?

EDIT:

War ich in der Lage, dies zu erreichen mit den folgenden codes:

float f = 0.1;
unsigned char *pc;
pc = (unsigned char*)&f;

//0.6 in float
pc[0] = 0x9A;
pc[1] = 0x99;
pc[2] = 0x19;
pc[3] = 0x3F;

std::cout << f << std::endl; //will print 0.6

und

*(unsigned int*)&f = (0x3F << 24) | (0x19 << 16) | (0x99 << 8) | (0x9A << 0);

Ich weiß, memcpy() ist eine "sauberere" Weg, es zu tun, aber auf diese Weise ich denke, die performance ist etwas besser.

Der Grund (int)f >> 24 zurück 0 ist, dass die int gegossen f gleich 0 in den ersten Platz: der cast sendet die Schwimmer auf Ihrem Boden. Es ist Undefiniertes Verhalten, aber es zu tun, hacky, wie Sie brauchen so etwas wie *(int*)&f >> 24.

InformationsquelleAutor mFeinstein | 2014-01-08

Schreibe einen Kommentar