Converting float values from big endian to little endian

前端 未结 9 1833
清歌不尽
清歌不尽 2020-11-30 02:40

Is it possible to convert floats from big to little endian? I have a big endian value from a PowerPC platform that I am sendING via TCP to a Windows process (li

相关标签:
9条回答
  • 2020-11-30 03:03

    Here is a function can reverse byte order of any type.

    template <typename T>
    T bswap(T val) {
        T retVal;
        char *pVal = (char*) &val;
        char *pRetVal = (char*)&retVal;
        int size = sizeof(T);
        for(int i=0; i<size; i++) {
            pRetVal[size-1-i] = pVal[i];
        }
    
        return retVal;
    }
    
    0 讨论(0)
  • 2020-11-30 03:07

    I found something roughly like this a long time ago. It was good for a laugh, but ingest at your own peril. I've not even compiled it:

    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;
    }
    
    0 讨论(0)
  • 2020-11-30 03:10

    This value is a float, but when I "memcpy" the value into a win32 float type and then call _byteswap_ulong on that value, I always get 0.0000?

    This should work. Can you post the code you have?

    However, if you care for performance (perhaps you do not, in that case you can ignore the rest), it should be possible to avoid memcpy, either by directly loading it into the target location and swapping the bytes there, or using a swap which does the swapping while copying.

    0 讨论(0)
  • 2020-11-30 03:13

    It might be easier to use the ntoa and related functions to convert from network to host and from host to network..the advantage it would be portable. Here is a link to an article that explains how to do this.

    0 讨论(0)
  • 2020-11-30 03:14

    From SDL_endian.h with slight changes:

    std::uint32_t Swap32(std::uint32_t x)
    {
        return static_cast<std::uint32_t>((x << 24) | ((x << 8) & 0x00FF0000) |
                                          ((x >> 8) & 0x0000FF00) | (x >> 24));
    }
    
    float SwapFloat(float x)
    {
        union
        {
            float f;
            std::uint32_t ui32;
        } swapper;
        swapper.f = x;
        swapper.ui32 = Swap32(swapper.ui32);
        return swapper.f;
    }
    
    0 讨论(0)
  • 2020-11-30 03:18

    simply reverse the four bytes works

    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;
    }
    
    0 讨论(0)
提交回复
热议问题