Hexadecimal conversion, conversion between hexadecimal and float

#include <winsock.h>
#pragma comment(lib, "Ws2_32.lib")

//将一个8位数高低4位交换
static unsigned char bswap_8(unsigned char v)
{

    return ((v & 0xff) << 4) | (v >> 4); //将参数(v & 0xff) << 4 相当于放到高位, v >> 4 位相当于放在低位
}

//将一个16位数高低8位交换
static unsigned short bswap_16(unsigned short v)
{
    return ((v & 0xff) << 8) | (v >> 8);
}

//将一个32位数高低16位交换
static unsigned int bswap_32(unsigned int v)
{
    return ((v & 0xff) << 24) | ((v & 0xff00) << 8) |
           ((v & 0xff0000) >> 8) | (v >> 24);
}

enum DataByteOrder
{
    ABCD,
    DCBA,
    BADC,
    CDAB
};

float get_float_databyteorder(const uint16_t *src, DataByteOrder order)
{
    float f = 0;
    uint32_t i;
    switch (order)
    {
    case ABCD:
        i = ntohl(((uint32_t)src[0] << 16) + src[1]);
        memcpy(&f, &i, sizeof(float));
        break;

    case DCBA:
        i = ntohl(bswap_32((((uint32_t)src[0]) << 16) + src[1]));
        memcpy(&f, &i, sizeof(float));
        break;

    case BADC:
        i = ntohl((uint32_t)(bswap_16(src[0]) << 16) + bswap_16(src[1]));
        memcpy(&f, &i, sizeof(float));
        break;

    case CDAB:
        i = ntohl((((uint32_t)src[1]) << 16) + src[0]);
        memcpy(&f, &i, sizeof(float));
        break;

    default:
        break;
    }

    return f;
}

void set_float_databyteorder(float f, DataByteOrder order, uint16_t *dest)
{
    uint32_t i;
    switch (order)
    {
    case ABCD:
        memcpy(&i, &f, sizeof(uint32_t));
        i = htonl(i);
        dest[0] = (uint16_t)(i >> 16);
        dest[1] = (uint16_t)i;
        break;

    case DCBA:
        memcpy(&i, &f, sizeof(uint32_t));
        i = bswap_32(htonl(i));
        dest[0] = (uint16_t)(i >> 16);
        dest[1] = (uint16_t)i;
        break;

    case BADC:
        memcpy(&i, &f, sizeof(uint32_t));
        i = htonl(i);
        dest[0] = (uint16_t)bswap_16(i >> 16);
        dest[1] = (uint16_t)bswap_16(i & 0xFFFF);
        break;

    case CDAB:
        memcpy(&i, &f, sizeof(uint32_t));
        i = htonl(i);
        dest[0] = (uint16_t)i;
        dest[1] = (uint16_t)(i >> 16);
        break;

    default:
        break;
    }
}

int main(int argc, char *argv[])
{
    float f1 = 12.34;
    uint16_t dst[2];
    set_float_databyteorder(f1, ABCD, dst);
    float f2 = get_float_databyteorder(dst, ABCD);
    return 0;
}

Guess you like

Origin blog.csdn.net/libaineu2004/article/details/128905455