Преобразование плавания оценивает от обратного порядка байтов до прямого порядка байтов

Действительно ли возможно преобразовать floats от большого до прямого порядка байтов? У меня есть значение с обратным порядком байтов с платформы PowerPC, которую я отправляю через TCP в процесс Windows (прямой порядок байтов). Это значение является a float, но когда я memcpy значение в плавающий тип Win32 и затем звонит _byteswap_ulongна том значении я всегда добираюсь 0.0000?

Что я делаю неправильно?

17
задан phuclv 18 May 2017 в 02:25
поделиться

5 ответов

просто поменять местами четыре байта работает

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;
}
31
ответ дан 30 November 2019 в 11:08
поделиться

Давным-давно я нашел что-то примерно такое. Это было хорошо для смеха, но глотайте на свой страх и риск. Я даже не компилировал его:

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;
}
7
ответ дан 30 November 2019 в 11:08
поделиться

Не запоминайте данные непосредственно в типе с плавающей запятой. Сохраните его как данные char , поменяйте местами байты и затем обработайте его как float.

2
ответ дан 30 November 2019 в 11:08
поделиться

Возможно, было бы проще использовать ntoa и связанные с ним функции для преобразования из сети в хост и из хоста в сеть .. Преимущество было бы в переносимости. Здесь - ссылка на статью, в которой объясняется, как это сделать.

1
ответ дан 30 November 2019 в 11:08
поделиться

Это значение является float, но когда я "memcpy" значение в тип float win32 и затем вызываю _byteswap_ulong на этом значении, я всегда получаю 0.0000?

Это должно работать. Можете выложить имеющийся у вас код?

Однако, если вы заботитесь о производительности (возможно, вы не заботитесь, в таком случае вы можете игнорировать остальное), должно быть возможно избежать memcpy, либо непосредственно загружая его в целевое место и меняя байты местами, либо используя своп, который делает своп во время копирования.

0
ответ дан 30 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: