Действительно ли возможно преобразовать float
s от большого до прямого порядка байтов? У меня есть значение с обратным порядком байтов с платформы PowerPC, которую я отправляю через TCP в процесс Windows (прямой порядок байтов). Это значение является a float
, но когда я memcpy
значение в плавающий тип Win32 и затем звонит _byteswap_ulong
на том значении я всегда добираюсь 0.0000?
Что я делаю неправильно?
просто поменять местами четыре байта работает
float ReverseFloat( const float inFloat )
{
float retVal;
char *floatToConvert = ( char* ) & inFloat;
char *returnFloat = ( char* ) & retVal;
// swap the bytes into a temporary buffer
returnFloat[0] = floatToConvert[3];
returnFloat[1] = floatToConvert[2];
returnFloat[2] = floatToConvert[1];
returnFloat[3] = floatToConvert[0];
return retVal;
}
Давным-давно я нашел что-то примерно такое. Это было хорошо для смеха, но глотайте на свой страх и риск. Я даже не компилировал его:
void * endian_swap(void * arg)
{
unsigned int n = *((int*)arg);
n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
*arg = n;
return arg;
}
Не запоминайте данные непосредственно в типе с плавающей запятой. Сохраните его как данные char , поменяйте местами байты и затем обработайте его как float.
Возможно, было бы проще использовать ntoa и связанные с ним функции для преобразования из сети в хост и из хоста в сеть .. Преимущество было бы в переносимости. Здесь - ссылка на статью, в которой объясняется, как это сделать.
Это значение является float, но когда я "memcpy" значение в тип float win32 и затем вызываю
_byteswap_ulong
на этом значении, я всегда получаю 0.0000?
Это должно работать. Можете выложить имеющийся у вас код?
Однако, если вы заботитесь о производительности (возможно, вы не заботитесь, в таком случае вы можете игнорировать остальное), должно быть возможно избежать memcpy, либо непосредственно загружая его в целевое место и меняя байты местами, либо используя своп, который делает своп во время копирования.