Я использую HIDAPI для отправки некоторых данных на USB-устройство. Эти данные могут быть отправлены только в виде байтового массива, и мне нужно отправить некоторые числа с плавающей запятой в этот массив данных. Я знаю, что поплавки имеют 4 байта, так что я думал, что это может работать:Как получить байты с плавающей точкой?
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;
А потом все, что я должен был сделать это:
g = (float)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]));
Но тестирование это показывает мне, что линии, как data[0] = (int) f >> 24;
возвращается всегда 0
. Что не так с моим кодом и как я могу сделать это правильно (т. Е. Разбить внутренние данные float в 4 символьных байта и перестроить один и тот же float позже)?
EDIT:
Я был в состоянии сделать это со следующими кодами:
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
и
*(unsigned int*)&f = (0x3F << 24) | (0x19 << 16) | (0x99 << 8) | (0x9A << 0);
Я знаю тетср() является "чист" способом сделать это , но таким образом я считаю, что производительность несколько лучше.
Причина '(int) f >> 24' возвращает' 0' в том, что 'int' casted' f' равен '0' в первую очередь: литой посылает поплавок на его пол. Это неопределенное поведение, но для этого хакерский способ вам понадобится нечто вроде '* (int *) & f >> 24'. –